summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c10
-rw-r--r--cgit.h4
-rw-r--r--cgitrc.5.txt23
-rw-r--r--cmd.c5
-rw-r--r--shared.c2
-rw-r--r--ui-shared.c2
-rw-r--r--ui-stats.c97
-rw-r--r--ui-stats.h19
8 files changed, 104 insertions, 58 deletions
diff --git a/cgit.c b/cgit.c
index 22b6d7c..57e11cd 100644
--- a/cgit.c
+++ b/cgit.c
@@ -14,2 +14,3 @@
14#include "ui-shared.h" 14#include "ui-shared.h"
15#include "ui-stats.h"
15#include "scan-tree.h" 16#include "scan-tree.h"
@@ -56,4 +57,4 @@ void config_cb(const char *name, const char *value)
56 ctx.cfg.enable_log_linecount = atoi(value); 57 ctx.cfg.enable_log_linecount = atoi(value);
57 else if (!strcmp(name, "enable-stats")) 58 else if (!strcmp(name, "max-stats"))
58 ctx.cfg.enable_stats = atoi(value); 59 ctx.cfg.max_stats = cgit_find_stats_period(value, NULL);
59 else if (!strcmp(name, "cache-size")) 60 else if (!strcmp(name, "cache-size"))
@@ -116,4 +117,4 @@ void config_cb(const char *name, const char *value)
116 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); 117 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
117 else if (ctx.repo && !strcmp(name, "repo.enable-stats")) 118 else if (ctx.repo && !strcmp(name, "repo.max-stats"))
118 ctx.repo->enable_stats = ctx.cfg.enable_stats && atoi(value); 119 ctx.repo->max_stats = cgit_find_stats_period(value, NULL);
119 else if (ctx.repo && !strcmp(name, "repo.module-link")) 120 else if (ctx.repo && !strcmp(name, "repo.module-link"))
@@ -185,2 +186,3 @@ static void prepare_context(struct cgit_context *ctx)
185 ctx->cfg.max_repodesc_len = 80; 186 ctx->cfg.max_repodesc_len = 80;
187 ctx->cfg.max_stats = 0;
186 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 188 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
diff --git a/cgit.h b/cgit.h
index 85045c4..f2cb671 100644
--- a/cgit.h
+++ b/cgit.h
@@ -63,3 +63,3 @@ struct cgit_repo {
63 int enable_log_linecount; 63 int enable_log_linecount;
64 int enable_stats; 64 int max_stats;
65}; 65};
@@ -155,3 +155,2 @@ struct cgit_config {
155 int enable_log_linecount; 155 int enable_log_linecount;
156 int enable_stats;
157 int local_time; 156 int local_time;
@@ -162,2 +161,3 @@ struct cgit_config {
162 int max_repodesc_len; 161 int max_repodesc_len;
162 int max_stats;
163 int nocache; 163 int nocache;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 60d3ea4..0bbbea3 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -76,6 +76,2 @@ enable-log-linecount
76 76
77enable-stats
78 Globally enable/disable statistics for each repository. Default
79 value: "0".
80
81favicon 77favicon
@@ -135,2 +131,7 @@ max-repodesc-length
135 131
132max-stats
133 Set the default maximum statistics period. Valid values are "week",
134 "month", "quarter" and "year". If unspecified, statistics are
135 disabled. Default value: none. See also: "repo.max-stats".
136
136module-link 137module-link
@@ -224,5 +225,6 @@ repo.enable-log-linecount
224 225
225repo.enable-stats 226repo.max-stats
226 A flag which can be used to disable the global setting 227 Override the default maximum statistics period. Valid values are equal
227 `enable-stats'. Default value: none. 228 to the values specified for the global "max-stats" setting. Default
229 value: none.
228 230
@@ -286,2 +288,6 @@ logo=/img/mylogo.png
286 288
289# Enable statistics per week, month and quarter
290max-stats=quarter
291
292
287# Set the title and heading of the repository index page 293# Set the title and heading of the repository index page
@@ -358,2 +364,5 @@ repo.enable-log-linecount=0
358 364
365# Restrict the max statistics period for this repo
366repo.max-stats=month
367
359 368
diff --git a/cmd.c b/cmd.c
index 744bf84..763a558 100644
--- a/cmd.c
+++ b/cmd.c
@@ -114,6 +114,3 @@ static void stats_fn(struct cgit_context *ctx)
114{ 114{
115 if (ctx->repo->enable_stats) 115 cgit_show_stats(ctx);
116 cgit_show_stats(ctx);
117 else
118 cgit_print_error("Stats disabled for this repo");
119} 116}
diff --git a/shared.c b/shared.c
index 37333f0..7382609 100644
--- a/shared.c
+++ b/shared.c
@@ -60,3 +60,3 @@ struct cgit_repo *cgit_add_repo(const char *url)
60 ret->enable_log_linecount = ctx.cfg.enable_log_linecount; 60 ret->enable_log_linecount = ctx.cfg.enable_log_linecount;
61 ret->enable_stats = ctx.cfg.enable_stats; 61 ret->max_stats = ctx.cfg.max_stats;
62 ret->module_link = ctx.cfg.module_link; 62 ret->module_link = ctx.cfg.module_link;
diff --git a/ui-shared.c b/ui-shared.c
index 0e688a0..97b9d46 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -643,3 +643,3 @@ void cgit_print_pageheader(struct cgit_context *ctx)
643 ctx->qry.sha1, ctx->qry.sha2, NULL); 643 ctx->qry.sha1, ctx->qry.sha2, NULL);
644 if (ctx->repo->enable_stats) 644 if (ctx->repo->max_stats)
645 reporevlink("stats", "stats", NULL, hc(cmd, "stats"), 645 reporevlink("stats", "stats", NULL, hc(cmd, "stats"),
diff --git a/ui-stats.c b/ui-stats.c
index 3cc8d70..1104485 100644
--- a/ui-stats.c
+++ b/ui-stats.c
@@ -1,4 +1,7 @@
1#include <string-list.h>
2
1#include "cgit.h" 3#include "cgit.h"
2#include "html.h" 4#include "html.h"
3#include <string-list.h> 5#include "ui-shared.h"
6#include "ui-stats.h"
4 7
@@ -6,19 +9,2 @@
6 9
7struct Period {
8 const char code;
9 const char *name;
10 int max_periods;
11 int count;
12
13 /* Convert a tm value to the first day in the period */
14 void (*trunc)(struct tm *tm);
15
16 /* Update tm value to start of next/previous period */
17 void (*dec)(struct tm *tm);
18 void (*inc)(struct tm *tm);
19
20 /* Pretty-print a tm value */
21 char *(*pretty)(struct tm *tm);
22};
23
24struct authorstat { 10struct authorstat {
@@ -139,3 +125,3 @@ static char *pretty_year(struct tm *tm)
139 125
140struct Period periods[] = { 126struct cgit_period periods[] = {
141 {'w', "week", 12, 4, trunc_week, dec_week, inc_week, pretty_week}, 127 {'w', "week", 12, 4, trunc_week, dec_week, inc_week, pretty_week},
@@ -146,4 +132,28 @@ struct Period periods[] = {
146 132
133/* Given a period code or name, return a period index (1, 2, 3 or 4)
134 * and update the period pointer to the correcsponding struct.
135 * If no matching code is found, return 0.
136 */
137int cgit_find_stats_period(const char *expr, struct cgit_period **period)
138{
139 int i;
140 char code = '\0';
141
142 if (!expr)
143 return 0;
144
145 if (strlen(expr) == 1)
146 code = expr[0];
147
148 for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++)
149 if (periods[i].code == code || !strcmp(periods[i].name, expr)) {
150 if (period)
151 *period = &periods[i];
152 return i+1;
153 }
154 return 0;
155}
156
147static void add_commit(struct string_list *authors, struct commit *commit, 157static void add_commit(struct string_list *authors, struct commit *commit,
148 struct Period *period) 158 struct cgit_period *period)
149{ 159{
@@ -192,3 +202,3 @@ static int cmp_total_commits(const void *a1, const void *a2)
192struct string_list collect_stats(struct cgit_context *ctx, 202struct string_list collect_stats(struct cgit_context *ctx,
193 struct Period *period) 203 struct cgit_period *period)
194{ 204{
@@ -235,3 +245,3 @@ void print_combined_authorrow(struct string_list *authors, int from, int to,
235 const char *name, const char *leftclass, const char *centerclass, 245 const char *name, const char *leftclass, const char *centerclass,
236 const char *rightclass, struct Period *period) 246 const char *rightclass, struct cgit_period *period)
237{ 247{
@@ -273,3 +283,4 @@ void print_combined_authorrow(struct string_list *authors, int from, int to,
273 283
274void print_authors(struct string_list *authors, int top, struct Period *period) 284void print_authors(struct string_list *authors, int top,
285 struct cgit_period *period)
275{ 286{
@@ -341,12 +352,18 @@ void cgit_show_stats(struct cgit_context *ctx)
341 struct string_list authors; 352 struct string_list authors;
342 struct Period *period; 353 struct cgit_period *period;
343 int top, i; 354 int top, i;
355 const char *code = "w";
344 356
345 period = &periods[0]; 357 if (ctx->qry.period)
346 if (ctx->qry.period) { 358 code = ctx->qry.period;
347 for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++) 359
348 if (periods[i].code == ctx->qry.period[0]) { 360 i = cgit_find_stats_period(code, &period);
349 period = &periods[i]; 361 if (!i) {
350 break; 362 cgit_print_error(fmt("Unknown statistics type: %c", code));
351 } 363 return;
364 }
365 if (i > ctx->repo->max_stats) {
366 cgit_print_error(fmt("Statistics type disabled: %s",
367 period->name));
368 return;
352 } 369 }
@@ -370,10 +387,12 @@ void cgit_show_stats(struct cgit_context *ctx)
370 htmlf("<input type='hidden' name='h' value='%s'/>", ctx->qry.head); 387 htmlf("<input type='hidden' name='h' value='%s'/>", ctx->qry.head);
371 html("Period: "); 388 if (ctx->repo->max_stats > 1) {
372 html("<select name='period' onchange='this.form.submit();'>"); 389 html("Period: ");
373 for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++) 390 html("<select name='period' onchange='this.form.submit();'>");
374 htmlf("<option value='%c'%s>%s</option>", 391 for (i = 0; i < ctx->repo->max_stats; i++)
375 periods[i].code, 392 htmlf("<option value='%c'%s>%s</option>",
376 period == &periods[i] ? " selected" : "", 393 periods[i].code,
377 periods[i].name); 394 period == &periods[i] ? " selected" : "",
378 html("</select><br/><br/>"); 395 periods[i].name);
396 html("</select><br/><br/>");
397 }
379 html("Authors: "); 398 html("Authors: ");
diff --git a/ui-stats.h b/ui-stats.h
index f1d744c..4f13dba 100644
--- a/ui-stats.h
+++ b/ui-stats.h
@@ -5,2 +5,21 @@
5 5
6struct cgit_period {
7 const char code;
8 const char *name;
9 int max_periods;
10 int count;
11
12 /* Convert a tm value to the first day in the period */
13 void (*trunc)(struct tm *tm);
14
15 /* Update tm value to start of next/previous period */
16 void (*dec)(struct tm *tm);
17 void (*inc)(struct tm *tm);
18
19 /* Pretty-print a tm value */
20 char *(*pretty)(struct tm *tm);
21};
22
23extern int cgit_find_stats_period(const char *expr, struct cgit_period **period);
24
6extern void cgit_show_stats(struct cgit_context *ctx); 25extern void cgit_show_stats(struct cgit_context *ctx);