src/main.cpp

Wed, 25 Feb 2026 22:40:43 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 25 Feb 2026 22:40:43 +0100
changeset 79
cd8ad39dda76
parent 78
5177d8af5536
permissions
-rw-r--r--

specifying both --csv and --csv-path should not be necessary

relates to #806

0
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /* Copyright 2025 Mike Becker. All rights reserved.
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 *
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Redistribution and use in source and binary forms, with or without
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * modification, are permitted provided that the following conditions are met:
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * 1. Redistributions of source code must retain the above copyright
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * notice, this list of conditions and the following disclaimer.
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 2. Redistributions in binary form must reproduce the above copyright
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer in the
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * documentation and/or other materials provided with the distribution.
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 *
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 */
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
25 #include "settings.h"
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
26 #include "repositories.h"
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
27 #include "process.h"
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
28 #include "heatmap.h"
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
29 #include "html.h"
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
30
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
31 #include <chrono>
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
32 #include <cstdlib>
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
33 #include <cstdio>
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
34 #include <cstring>
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
35 #include <cerrno>
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
36
44
de22ded6d50a add total commits counters
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
37 #include <numeric>
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
38 #include <ranges>
44
de22ded6d50a add total commits counters
Mike Becker <universe@uap-core.de>
parents: 41
diff changeset
39
13
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
40 using namespace std::chrono;
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
41
73
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
42 static constexpr auto program_version = "1.2.0-preview";
29
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
43
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
44 static void print_help() {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
45 fputs(
23
b4979c194dc8 replace working title with official project title
Mike Becker <universe@uap-core.de>
parents: 21
diff changeset
46 "Usage: repoheat [OPTION]... [PATH]...\n\n"
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
47 "Options:\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
48 " -a, --author <name> Only report this author\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
49 " (repeat option to report multiple authors)\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
50 " -A, --authormap <file> Apply an author mapping file\n"
79
cd8ad39dda76 specifying both --csv and --csv-path should not be necessary
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
51 " --csv Output the gathered data as CSV to stdout\n"
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
52 " --csv-path <file> Write CSV data to file instead of stdout\n"
20
8639ccd855ba implement --fragment option
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
53 " -d, --depth <num> The search depth (default: 1, max: 255)\n"
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
54 " -f, --fragment [indent] Output as fragment (HTML only)\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
55 " -h, --help Print this help message\n"
27
d2eee642a31b do not pull repos by default - fixes #587
Mike Becker <universe@uap-core.de>
parents: 24
diff changeset
56 " -p, --pull Try to pull the repositories\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
57 " -s, --separate Output a separate heat map for each repository\n"
73
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
58 " --styles-and-script Output the default CSS and Javascript and quit\n"
29
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
59 " -V, --version Output the version of this program and exit\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
60 " -y, --year <year> The year for which to create the heat map\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
61 " --hg <path> Path to hg binary (default: /usr/bin/hg)\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
62 " --git <path> Path to git binary (default: /usr/bin/git)\n\n"
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
63 "Scans all specified paths recursively for Mercurial and Git repositories and\n"
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
64 "creates a commit heat map for the specified \033[1myear\033[22m or the current year.\n"
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
65 "By default, the recursion \033[1mdepth\033[22m is one, meaning that this tool assumes that\n"
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
66 "each \033[1mpath\033[22m is either a repository or contains repositories as subdirectories.\n"
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
67 "You can change the \033[1mdepth\033[22m to support other directory structures.\n\n"
27
d2eee642a31b do not pull repos by default - fixes #587
Mike Becker <universe@uap-core.de>
parents: 24
diff changeset
68 "When you specify the \033[1m--pull\033[22m option, this tool will execute the pull command\n"
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
69 "(and for hg the update command) before retrieving the commit log, assuming\n"
9
98312f94dbdd skip authorization requests when pulling
Mike Becker <universe@uap-core.de>
parents: 8
diff changeset
70 "to be on the default branch with \033[4mno uncommitted changes\033[24m. If pulling leads to\n"
98312f94dbdd skip authorization requests when pulling
Mike Becker <universe@uap-core.de>
parents: 8
diff changeset
71 "an error, an error message is written to stderr and the process continues\n"
98312f94dbdd skip authorization requests when pulling
Mike Becker <universe@uap-core.de>
parents: 8
diff changeset
72 "with the repository in its current state. This is also the case when pulling\n"
27
d2eee642a31b do not pull repos by default - fixes #587
Mike Becker <universe@uap-core.de>
parents: 24
diff changeset
73 "would require authorization.\n\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
74 "By default, this tool reports commits from all authors. If you want to include\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
75 "only specific authors in the report, you can use the \033[1m--author\033[22m option with as\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
76 "many authors as you like. You can specify either the full author strings with\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
77 "name and mail address, just the mail address, or even just the local-part of\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
78 "the mail address. In case your repository contains commits from an author who\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
79 "used different names or mail addresses, you can use the \033[1m--authormap\033[22m option\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
80 "to specify a file that contains pairs of author strings, like in the following\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
81 "example:\n\n"
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
82 " Full Name <full.name@example.org> = New Name <new.name@example.org>\n"
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
83 " just.mail@example.org = Jus Mail <just.mail@example.org>\n"
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
84 " jane = Jane Doe <jane.doe@example.org>\n\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
85 "The different variants of full string, only mail address, and only local-part\n"
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
86 "should \033[4monly\033[24m be used on the left-hand side. When you use the \033[1m--author\033[22m option at\n"
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
87 "the same time, you only need to specify the new author names.\n\n"
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
88 "Finally, this tool prints an HTML page to stdout. A separate heap map is\n"
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
89 "generated for each author showing commits across all repositories, unless the\n"
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
90 "\033[1m--separate\033[22m option is specified in which case each repository is displayed with\n"
20
8639ccd855ba implement --fragment option
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
91 "its own heat map. By using the \033[1m--fragment\033[22m option, the tool only outputs a\n"
8639ccd855ba implement --fragment option
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
92 "single HTML div container without any header or footer that can be embedded in\n"
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
93 "your custom web page. You can optionally specify an indentation for that\n"
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
94 "container (default is 0 and maximum is 12).\n"
73
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
95 "When you want to combine this with the default style and scripts, you can use\n"
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
96 "the \033[1m--styles-and-script\033[22m option print the defaults to stdout and redirect them\n"
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
97 "into a file when you are composing your custom HTML page.\n\n"
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
98 "In case you want to work with the raw data, you can advise the tool to output\n"
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
99 "the data in CSV format with the \033[1m--csv\033[22m option. The CSV data will be written to\n"
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
100 "stdout instead of the HTML unless you specify a different file with \033[1m--csv-path\033[22m.\n"
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
101 , stderr);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
102 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
103
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
104 static bool chk_arg(const char *arg, const char *opt1, const char *opt2) {
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
105 return strcmp(arg, opt1) == 0 || (opt2 != nullptr && strcmp(arg, opt2) == 0);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
106 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
107
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
108 template<typename T>
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
109 static bool parse_unsigned(const char *str, T *result, unsigned long max) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
110 char *endptr;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
111 errno = 0;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
112 unsigned long d = strtoul(str, &endptr, 10);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
113 if (*endptr != '\0' || errno == ERANGE) return true;
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
114 if (d <= max) {
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
115 *result = d;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
116 return false;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
117 } else {
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
118 errno = ERANGE;
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
119 return true;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
120 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
121 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
122
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
123 static int parse_args(fm::settings &settings, int argc, char *argv[]) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
124 for (int i = 1; i < argc; i++) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
125 if (chk_arg(argv[i], "-h", "--help")) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
126 print_help();
29
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
127 return 1;
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
128 } else if (chk_arg(argv[i], "-d", "--depth")) {
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
129 if (i + 1 >= argc || parse_unsigned(argv[++i], &settings.depth, 255)) {
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
130 fputs("missing or invalid depth\n", stderr);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
131 return -1;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
132 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
133 } else if (chk_arg(argv[i], "-y", "--year")) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
134 if (i + 1 >= argc || parse_unsigned(argv[++i], &settings.year, 9999)) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
135 fputs("missing or invalid year\n", stderr);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
136 return -1;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
137 }
14
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
138 } else if (chk_arg(argv[i], "-a", "--author")) {
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
139 if (i + 1 < argc) {
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
140 settings.authors.emplace_back(argv[++i]);
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
141 } else {
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
142 fputs("missing author name\n", stderr);
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
143 return -1;
f0ae064c5b9c implement author filter
Mike Becker <universe@uap-core.de>
parents: 13
diff changeset
144 }
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
145 } else if (chk_arg(argv[i], "--csv", nullptr)) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
146 settings.csv = true;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
147 } else if (chk_arg(argv[i], "--csv-path", nullptr)) {
79
cd8ad39dda76 specifying both --csv and --csv-path should not be necessary
Mike Becker <universe@uap-core.de>
parents: 78
diff changeset
148 settings.csv = true;
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
149 if (i + 1 < argc) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
150 settings.csv_path.assign(argv[++i]);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
151 } else {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
152 fputs("missing csv path\n", stderr);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
153 return -1;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
154 }
27
d2eee642a31b do not pull repos by default - fixes #587
Mike Becker <universe@uap-core.de>
parents: 24
diff changeset
155 } else if (chk_arg(argv[i], "-p", "--pull")) {
d2eee642a31b do not pull repos by default - fixes #587
Mike Becker <universe@uap-core.de>
parents: 24
diff changeset
156 settings.update_repos = true;
20
8639ccd855ba implement --fragment option
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
157 } else if (chk_arg(argv[i], "-f", "--fragment")) {
8639ccd855ba implement --fragment option
Mike Becker <universe@uap-core.de>
parents: 19
diff changeset
158 settings.fragment = true;
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
159 if (i + 1 < argc && !parse_unsigned(argv[i+1], &settings.fragment_indent, html::max_external_indentation)) {
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
160 i++;
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
161 } else if (errno == ERANGE) {
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
162 fputs("invalid fragment indentation\n", stderr);
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
163 return -1;
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
164 }
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
165 } else if (chk_arg(argv[i], "-s", "--separate")) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
166 settings.separate = true;
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
167 } else if (chk_arg(argv[i], "-A", "--authormap")) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
168 if (i + 1 < argc) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
169 if (settings.parse_authormap(argv[++i])) {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
170 fputs("parsing authormap failed\n", stderr);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
171 return -1;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
172 }
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
173 } else {
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
174 fputs("missing filename for authormap\n", stderr);
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
175 return -1;
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
176 }
29
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
177 } else if (chk_arg(argv[i], "-V", "--version")) {
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
178 printf("repoheat version %s\n", program_version);
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
179 return 1;
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
180 } else if (chk_arg(argv[i], "--hg", nullptr)) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
181 if (i + 1 < argc) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
182 settings.hg.assign(argv[++i]);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
183 } else {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
184 fputs("--hg is expecting a path\n", stderr);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
185 return -1;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
186 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
187 } else if (chk_arg(argv[i], "--git", nullptr)) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
188 if (i + 1 < argc) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
189 settings.git.assign(argv[++i]);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
190 } else {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
191 fputs("--git is expecting a path\n", stderr);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
192 return -1;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
193 }
73
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
194 } else if (chk_arg(argv[i], "--styles-and-script", nullptr)) {
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
195 settings.styles_and_script = true;
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
196 if (argc != 2) {
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
197 fputs("Error: --styles-and-script must be the only option when present\n", stderr);
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
198 return -1;
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
199 }
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
200 } else if (argv[i][0] == '-') {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
201 fprintf(stderr, "Unknown option: %s\n", argv[i]);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
202 return -1;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
203 } else {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
204 settings.paths.emplace_back(argv[i]);
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
205 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
206 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
207
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
208 if (settings.paths.empty()) {
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
209 settings.paths.emplace_back("./");
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
210 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
211
0
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
212 return 0;
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
213 }
b4b281ef2d0f project init
Mike Becker <universe@uap-core.de>
parents:
diff changeset
214
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
215 static void generate_html(
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
216 const fm::settings &settings,
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
217 year report_year, year_month_day report_begin, year_month_day report_end,
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
218 const fm::heatmap &heatmap) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
219
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
220 html::open(settings.fragment, settings.fragment_indent);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
221 for (const auto &[repo, authors] : heatmap.data()) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
222 bool h1_rendered = false;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
223 for (const auto &[author, entries] : authors) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
224 if (settings.exclude_author(author)) continue;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
225 if (!h1_rendered) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
226 html::heading_repo(repo);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
227 h1_rendered = true;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
228 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
229 html::chart_begin(repo, author);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
230
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
231 const auto commits_per_month = heatmap.commits_per_month(repo, author, report_year);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
232 const auto total_commits = std::accumulate(commits_per_month.begin(), commits_per_month.end(), 0u,
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
233 [](unsigned sum, const auto &summary) { return sum + summary.count(); });
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
234 html::heading_author(author, total_commits);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
235 html::table_begin(report_year, settings.separate, commits_per_month);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
236
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
237 // initialize counters
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
238 unsigned column = 0, row = 0;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
239
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
240 // initialize the first day (which must be a Monday, possibly the year before)
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
241 sys_days day_to_check = January / Monday[1] / report_year;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
242 if (year_month_day{day_to_check}.day() != 1d) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
243 day_to_check -= days{7};
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
244 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
245
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
246 // remember the starting point
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
247 auto start = day_to_check;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
248
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
249 // now add all entries for Monday, Tuesdays, etc. always starting back in January
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
250 while (true) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
251 html::row_begin(row);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
252
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
253 // check if we need to add blank cells
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
254 while (day_to_check < report_begin) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
255 html::cell_out_of_range();
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
256 day_to_check += days{7};
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
257 column++;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
258 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
259
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
260 while (day_to_check <= report_end) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
261 // get the entry from the heatmap
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
262 auto find_result = entries.find(day_to_check);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
263 if (find_result == entries.end()) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
264 html::cell(day_to_check);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
265 } else {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
266 html::cell(day_to_check, settings.separate, find_result->second);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
267 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
268 // advance seven days and one column
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
269 day_to_check += days{7};
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
270 column++;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
271 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
272 // fill remaining columns with blank cells
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
273 for (unsigned i = column ; i < html::columns ; i++) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
274 html::cell_out_of_range();
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
275 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
276
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
277 // terminate the row
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
278 html::row_end();
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
279
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
280 // if we have seen all seven weekdays, that's it
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
281 if (++row == 7) break;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
282
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
283 // otherwise, advance the starting point by one day, reset, and begin a new row
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
284 start += days{1};
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
285 day_to_check = start;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
286 column =0;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
287 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
288
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
289 html::table_end();
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
290 html::chart_end();
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
291 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
292 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
293 html::close(settings.fragment);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
294 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
295
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
296 static int generate_csv(const fm::settings &settings, const fm::heatmap &heatmap) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
297 FILE *out;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
298 if (settings.csv_path.empty()) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
299 out = stdout;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
300 } else {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
301 out = fopen(settings.csv_path.c_str(), "w");
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
302 if (out == nullptr) return 1;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
303 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
304
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
305 auto escape_csv = [](const std::string &str) -> std::string {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
306 std::string result;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
307 result.reserve(str.size()+2);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
308 result += '"';
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
309 for (char c : str) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
310 if (c == '"') {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
311 result += '"';
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
312 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
313 result += c;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
314 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
315 result += '"';
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
316 return result;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
317 };
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
318
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
319 fprintf(out, "repository,author,date,hash,summary,is_tag\n");
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
320 for (const auto &authors: heatmap.data() | std::views::values) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
321 for (const auto &[author, entries]: authors) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
322 for (const auto &[date, commits]: entries) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
323 for (const auto &[repo, infos] : commits.summaries) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
324 for (const auto &info : infos) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
325 fprintf(out, "%s,%s,%d-%02u-%02u,%s,%s,false\n",
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
326 repo.c_str(),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
327 author.c_str(),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
328 static_cast<int>(date.year()),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
329 static_cast<unsigned>(date.month()),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
330 static_cast<unsigned>(date.day()),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
331 info.hash.c_str(),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
332 escape_csv(info.message).c_str()
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
333 );
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
334 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
335 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
336 for (const auto &[repo, infos] : commits.tags) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
337 for (const auto &info : infos) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
338 fprintf(out, "%s,%s,%d-%02u-%02u,%s,%s,true\n",
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
339 repo.c_str(),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
340 author.c_str(),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
341 static_cast<int>(date.year()),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
342 static_cast<unsigned>(date.month()),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
343 static_cast<unsigned>(date.day()),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
344 info.hash.c_str(),
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
345 escape_csv(info.message).c_str()
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
346 );
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
347 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
348 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
349 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
350 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
351 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
352 fclose(out);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
353 return 0;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
354 }
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
355
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
356 int main(int argc, char *argv[]) {
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
357 // parse settings
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
358 fm::settings settings;
29
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
359 if (int result = parse_args(settings, argc, argv); result != 0) {
24bd6a6d5f59 add version output
Mike Becker <universe@uap-core.de>
parents: 27
diff changeset
360 return result < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
361 }
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
362
73
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
363 // check special options
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
364 if (settings.styles_and_script) {
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
365 html::styles_and_script();
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
366 return 0;
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
367 }
707f42bb0484 add --styles-and-script option to output default CSS and Javascript for page composition
Mike Becker <universe@uap-core.de>
parents: 71
diff changeset
368
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
369 // check hg and git
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
370 fm::process proc;
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
371 proc.setbin(settings.hg);
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
372 if (proc.exec({"--version"})) {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
373 fprintf(stderr, "Testing hg binary '%s' failed!\n", settings.hg.c_str());
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
374 return EXIT_FAILURE;
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
375 }
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
376 proc.setbin(settings.git);
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
377 if (proc.exec({"--version"})) {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
378 fprintf(stderr, "Testing git binary '%s' failed!\n", settings.git.c_str());
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
379 return EXIT_FAILURE;
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
380 }
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
381
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
382 // scan for repos
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
383 fm::repositories repos;
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
384 for (auto &&path: settings.paths) {
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
385 if (!fm::repositories::exists(path)) {
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
386 fprintf(stderr, "Path '%s' does not exist!\n", path.c_str());
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
387 return EXIT_FAILURE;
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
388 }
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
389 repos.scan(path, settings.depth);
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
390 }
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
391
52
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
392 // check if we found something
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
393 if (repos.count() == 0) {
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
394 fprintf(stderr, "No repositories found!\n");
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
395 return EXIT_FAILURE;
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
396 }
e9edc3bd0301 add custom fragment indentation
Mike Becker <universe@uap-core.de>
parents: 46
diff changeset
397
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
398 // update repos, if not disabled
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
399 if (settings.update_repos) {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
400 for (auto &&repo : repos.list()) {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
401 proc.chdir(repo.path);
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
402 if (repo.type == fm::HG) {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
403 proc.setbin(settings.hg);
9
98312f94dbdd skip authorization requests when pulling
Mike Becker <universe@uap-core.de>
parents: 8
diff changeset
404 if (proc.exec({"pull", "-y"})) {
21
bc8b76ca9ee9 fix possible misleading error output
Mike Becker <universe@uap-core.de>
parents: 20
diff changeset
405 fprintf(stderr, "Pulling repo '%s' failed - continue without pull.\n", repo.path.c_str());
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
406 } else if (proc.exec({"update"})) {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
407 fprintf(stderr, "Updating repo '%s' failed!\nMaybe there are local changes?\n", repo.path.c_str());
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
408 }
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
409 } else {
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
410 proc.setbin(settings.git);
67
7962d771b939 fix that only the main branch was considered in git repositories
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
411 if (proc.exec({"pull", "-q", "--all"})) {
21
bc8b76ca9ee9 fix possible misleading error output
Mike Becker <universe@uap-core.de>
parents: 20
diff changeset
412 fprintf(stderr, "Pulling repo '%s' failed - continue without pull.\n", repo.path.c_str());
4
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
413 }
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
414 }
82680ce258d6 add automatic pull/udate of repositories
Mike Becker <universe@uap-core.de>
parents: 3
diff changeset
415 }
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
416 }
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
417
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
418 // determine our reporting range
13
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
419 year report_year{
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
420 settings.year == fm::settings_current_year
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
421 ? year_month_day{floor<days>(system_clock::now())}.year()
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
422 : year{settings.year}
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
423 };
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
424 year_month_day report_begin{report_year, January, 1d};
e714005f3e9d improve readability
Mike Becker <universe@uap-core.de>
parents: 12
diff changeset
425 year_month_day report_end{report_year, December, 31d};
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
426
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
427 // read the commit logs
56
3d2720f95cfb fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents: 54
diff changeset
428 fm::heatmap heatmap{settings.separate};
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
429 for (auto &&repo : repos.list()) {
56
3d2720f95cfb fix that commits were not listed per repository in the combined view
Mike Becker <universe@uap-core.de>
parents: 54
diff changeset
430 heatmap.set_repo(repo.name);
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
431 proc.chdir(repo.path);
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
432 if (repo.type == fm::HG) {
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
433 proc.setbin(settings.hg);
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
434 if (proc.exec_log({"log",
36
e223879aa02a fix date filters
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
435 "--date", std::format("{0}-01-01 00:00:00 to {0}-12-31 23:59:59", report_year),
76
110a234a3260 add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
436 "--template", "{node}#{author}#{date|shortdate}#{tags}#{desc|firstline}\\n"})) {
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
437 fprintf(stderr, "Reading commit log for repo '%s' failed!\n", repo.path.c_str());
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
438 return EXIT_FAILURE;
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
439 }
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
440 heatmap.add(settings, proc.output());
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
441 } else {
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
442 proc.setbin(settings.git);
8
6a2e20a4a8ff fix log not being captured from git
Mike Becker <universe@uap-core.de>
parents: 7
diff changeset
443 if (proc.exec_log({"log",
67
7962d771b939 fix that only the main branch was considered in git repositories
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
444 "--all",
61
d77763d2fdda highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents: 59
diff changeset
445 "--decorate=short",
d77763d2fdda highlight days with tags - resolves #672
Mike Becker <universe@uap-core.de>
parents: 59
diff changeset
446 "--decorate-refs=refs/tags/",
36
e223879aa02a fix date filters
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
447 "--since", std::format("{0}-01-01 00:00:00", report_year),
e223879aa02a fix date filters
Mike Becker <universe@uap-core.de>
parents: 34
diff changeset
448 "--until", std::format("{0}-12-31 23:59:59", report_year),
76
110a234a3260 add reading commit hashes from the commit log - resolves #807
Mike Becker <universe@uap-core.de>
parents: 75
diff changeset
449 "--format=tformat:%H#%an <%ae>#%cs#%(decorate:prefix=,suffix=,tag=,separator= )#%s"})) {
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
450 fprintf(stderr, "Reading commit log for repo '%s' failed!\n", repo.path.c_str());
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
451 return EXIT_FAILURE;
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
452 }
16
730a5638c4ad implement authormap
Mike Becker <universe@uap-core.de>
parents: 14
diff changeset
453 heatmap.add(settings, proc.output());
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
454 }
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
455 }
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
456
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
457 bool html = true;
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
458 if (settings.csv) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
459 if (generate_csv(settings, heatmap)) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
460 return EXIT_FAILURE;
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
461 }
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
462 html = !settings.csv_path.empty();
5
60c2588b4455 finish MVP
Mike Becker <universe@uap-core.de>
parents: 4
diff changeset
463 }
78
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
464 if (html) {
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
465 generate_html(settings, report_year, report_begin, report_end, heatmap);
5177d8af5536 add CSV export of raw data - resolves #806
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
466 }
3
c87bde92805f add repository scanner
Mike Becker <universe@uap-core.de>
parents: 1
diff changeset
467
1
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
468 return EXIT_SUCCESS;
9bf126bc825c add settings and CLI
Mike Becker <universe@uap-core.de>
parents: 0
diff changeset
469 }

mercurial