| -rw-r--r-- | cgit.c | 10 | ||||
| -rw-r--r-- | cgit.h | 4 | ||||
| -rw-r--r-- | cgitrc.5.txt | 23 | ||||
| -rw-r--r-- | cmd.c | 5 | ||||
| -rw-r--r-- | shared.c | 2 | ||||
| -rw-r--r-- | ui-shared.c | 2 | ||||
| -rw-r--r-- | ui-stats.c | 97 | ||||
| -rw-r--r-- | ui-stats.h | 19 |
8 files changed, 58 insertions, 104 deletions
@@ -12,7 +12,6 @@ #include "configfile.h" #include "html.h" #include "ui-shared.h" -#include "ui-stats.h" #include "scan-tree.h" const char *cgit_version = CGIT_VERSION; @@ -55,8 +54,8 @@ void config_cb(const char *name, const char *value) ctx.cfg.enable_log_filecount = atoi(value); else if (!strcmp(name, "enable-log-linecount")) ctx.cfg.enable_log_linecount = atoi(value); - else if (!strcmp(name, "max-stats")) - ctx.cfg.max_stats = cgit_find_stats_period(value, NULL); + else if (!strcmp(name, "enable-stats")) + ctx.cfg.enable_stats = atoi(value); else if (!strcmp(name, "cache-size")) ctx.cfg.cache_size = atoi(value); else if (!strcmp(name, "cache-root")) @@ -115,8 +114,8 @@ void config_cb(const char *name, const char *value) ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount")) ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); - else if (ctx.repo && !strcmp(name, "repo.max-stats")) - ctx.repo->max_stats = cgit_find_stats_period(value, NULL); + else if (ctx.repo && !strcmp(name, "repo.enable-stats")) + ctx.repo->enable_stats = ctx.cfg.enable_stats && atoi(value); else if (ctx.repo && !strcmp(name, "repo.module-link")) ctx.repo->module_link= xstrdup(value); else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) { @@ -184,7 +183,6 @@ static void prepare_context(struct cgit_context *ctx) ctx->cfg.max_lock_attempts = 5; ctx->cfg.max_msg_len = 80; ctx->cfg.max_repodesc_len = 80; - ctx->cfg.max_stats = 0; ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; ctx->cfg.renamelimit = -1; ctx->cfg.robots = "index, nofollow"; @@ -61,7 +61,7 @@ struct cgit_repo { int snapshots; int enable_log_filecount; int enable_log_linecount; - int max_stats; + int enable_stats; }; struct cgit_repolist { @@ -153,13 +153,13 @@ struct cgit_config { int enable_index_links; int enable_log_filecount; int enable_log_linecount; + int enable_stats; int local_time; int max_repo_count; int max_commit_count; int max_lock_attempts; int max_msg_len; int max_repodesc_len; - int max_stats; int nocache; int renamelimit; int snapshots; diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 0bbbea3..60d3ea4 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -74,6 +74,10 @@ enable-log-linecount and removed lines for each commit on the repository log page. Default value: "0". +enable-stats + Globally enable/disable statistics for each repository. Default + value: "0". + favicon Url used as link to a shortcut icon for cgit. If specified, it is suggested to use the value "/favicon.ico" since certain browsers will @@ -129,11 +133,6 @@ max-repodesc-length Specifies the maximum number of repo description characters to display on the repository index page. Default value: "80". -max-stats - Set the default maximum statistics period. Valid values are "week", - "month", "quarter" and "year". If unspecified, statistics are - disabled. Default value: none. See also: "repo.max-stats". - module-link Text which will be used as the formatstring for a hyperlink when a submodule is printed in a directory listing. The arguments for the @@ -223,10 +222,9 @@ repo.enable-log-linecount A flag which can be used to disable the global setting `enable-log-linecount'. Default value: none. -repo.max-stats - Override the default maximum statistics period. Valid values are equal - to the values specified for the global "max-stats" setting. Default - value: none. +repo.enable-stats + A flag which can be used to disable the global setting + `enable-stats'. Default value: none. repo.name The value to show as repository name. Default value: <repo.url>. @@ -286,10 +284,6 @@ favicon=/favicon.ico logo=/img/mylogo.png -# Enable statistics per week, month and quarter -max-stats=quarter - - # Set the title and heading of the repository index page root-title=foobar.com git repositories @@ -362,9 +356,6 @@ repo.snapshots=0 # Disable line-counts for this repo repo.enable-log-linecount=0 -# Restrict the max statistics period for this repo -repo.max-stats=month - BUGS ---- @@ -112,7 +112,10 @@ static void snapshot_fn(struct cgit_context *ctx) static void stats_fn(struct cgit_context *ctx) { - cgit_show_stats(ctx); + if (ctx->repo->enable_stats) + cgit_show_stats(ctx); + else + cgit_print_error("Stats disabled for this repo"); } static void summary_fn(struct cgit_context *ctx) @@ -58,7 +58,7 @@ struct cgit_repo *cgit_add_repo(const char *url) ret->snapshots = ctx.cfg.snapshots; ret->enable_log_filecount = ctx.cfg.enable_log_filecount; ret->enable_log_linecount = ctx.cfg.enable_log_linecount; - ret->max_stats = ctx.cfg.max_stats; + ret->enable_stats = ctx.cfg.enable_stats; ret->module_link = ctx.cfg.module_link; ret->readme = NULL; return ret; diff --git a/ui-shared.c b/ui-shared.c index 97b9d46..0e688a0 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -641,7 +641,7 @@ void cgit_print_pageheader(struct cgit_context *ctx) ctx->qry.head, ctx->qry.sha1); cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, ctx->qry.sha1, ctx->qry.sha2, NULL); - if (ctx->repo->max_stats) + if (ctx->repo->enable_stats) reporevlink("stats", "stats", NULL, hc(cmd, "stats"), ctx->qry.head, NULL, NULL); if (ctx->repo->readme) @@ -1,12 +1,26 @@ -#include <string-list.h> - #include "cgit.h" #include "html.h" -#include "ui-shared.h" -#include "ui-stats.h" +#include <string-list.h> #define MONTHS 6 +struct Period { + const char code; + const char *name; + int max_periods; + int count; + + /* Convert a tm value to the first day in the period */ + void (*trunc)(struct tm *tm); + + /* Update tm value to start of next/previous period */ + void (*dec)(struct tm *tm); + void (*inc)(struct tm *tm); + + /* Pretty-print a tm value */ + char *(*pretty)(struct tm *tm); +}; + struct authorstat { long total; struct string_list list; @@ -123,39 +137,15 @@ static char *pretty_year(struct tm *tm) return fmt("%d", tm->tm_year + 1900); } -struct cgit_period periods[] = { +struct Period periods[] = { {'w', "week", 12, 4, trunc_week, dec_week, inc_week, pretty_week}, {'m', "month", 12, 4, trunc_month, dec_month, inc_month, pretty_month}, {'q', "quarter", 12, 4, trunc_quarter, dec_quarter, inc_quarter, pretty_quarter}, {'y', "year", 12, 4, trunc_year, dec_year, inc_year, pretty_year}, }; -/* Given a period code or name, return a period index (1, 2, 3 or 4) - * and update the period pointer to the correcsponding struct. - * If no matching code is found, return 0. - */ -int cgit_find_stats_period(const char *expr, struct cgit_period **period) -{ - int i; - char code = '\0'; - - if (!expr) - return 0; - - if (strlen(expr) == 1) - code = expr[0]; - - for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++) - if (periods[i].code == code || !strcmp(periods[i].name, expr)) { - if (period) - *period = &periods[i]; - return i+1; - } - return 0; -} - static void add_commit(struct string_list *authors, struct commit *commit, - struct cgit_period *period) + struct Period *period) { struct commitinfo *info; struct string_list_item *author, *item; @@ -200,7 +190,7 @@ static int cmp_total_commits(const void *a1, const void *a2) * timeperiod into a nested string_list collection. */ struct string_list collect_stats(struct cgit_context *ctx, - struct cgit_period *period) + struct Period *period) { struct string_list authors; struct rev_info rev; @@ -243,7 +233,7 @@ struct string_list collect_stats(struct cgit_context *ctx, void print_combined_authorrow(struct string_list *authors, int from, int to, const char *name, const char *leftclass, const char *centerclass, - const char *rightclass, struct cgit_period *period) + const char *rightclass, struct Period *period) { struct string_list_item *author; struct authorstat *authorstat; @@ -281,8 +271,7 @@ void print_combined_authorrow(struct string_list *authors, int from, int to, htmlf("<td class='%s'>%d</td></tr>", rightclass, total); } -void print_authors(struct string_list *authors, int top, - struct cgit_period *period) +void print_authors(struct string_list *authors, int top, struct Period *period) { struct string_list_item *author; struct authorstat *authorstat; @@ -350,22 +339,16 @@ void print_authors(struct string_list *authors, int top, void cgit_show_stats(struct cgit_context *ctx) { struct string_list authors; - struct cgit_period *period; + struct Period *period; int top, i; - const char *code = "w"; - if (ctx->qry.period) - code = ctx->qry.period; - - i = cgit_find_stats_period(code, &period); - if (!i) { - cgit_print_error(fmt("Unknown statistics type: %c", code)); - return; - } - if (i > ctx->repo->max_stats) { - cgit_print_error(fmt("Statistics type disabled: %s", - period->name)); - return; + period = &periods[0]; + if (ctx->qry.period) { + for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++) + if (periods[i].code == ctx->qry.period[0]) { + period = &periods[i]; + break; + } } authors = collect_stats(ctx, period); qsort(authors.items, authors.nr, sizeof(struct string_list_item), @@ -385,16 +368,14 @@ void cgit_show_stats(struct cgit_context *ctx) html("<form method='get' action='.' style='float: right; text-align: right;'>"); if (strcmp(ctx->qry.head, ctx->repo->defbranch)) htmlf("<input type='hidden' name='h' value='%s'/>", ctx->qry.head); - if (ctx->repo->max_stats > 1) { - html("Period: "); - html("<select name='period' onchange='this.form.submit();'>"); - for (i = 0; i < ctx->repo->max_stats; i++) - htmlf("<option value='%c'%s>%s</option>", - periods[i].code, - period == &periods[i] ? " selected" : "", - periods[i].name); - html("</select><br/><br/>"); - } + html("Period: "); + html("<select name='period' onchange='this.form.submit();'>"); + for (i = 0; i < sizeof(periods) / sizeof(periods[0]); i++) + htmlf("<option value='%c'%s>%s</option>", + periods[i].code, + period == &periods[i] ? " selected" : "", + periods[i].name); + html("</select><br/><br/>"); html("Authors: "); html(""); html("<select name='ofs' onchange='this.form.submit();'>"); @@ -3,25 +3,6 @@ #include "cgit.h" -struct cgit_period { - const char code; - const char *name; - int max_periods; - int count; - - /* Convert a tm value to the first day in the period */ - void (*trunc)(struct tm *tm); - - /* Update tm value to start of next/previous period */ - void (*dec)(struct tm *tm); - void (*inc)(struct tm *tm); - - /* Pretty-print a tm value */ - char *(*pretty)(struct tm *tm); -}; - -extern int cgit_find_stats_period(const char *expr, struct cgit_period **period); - extern void cgit_show_stats(struct cgit_context *ctx); #endif /* UI_STATS_H */ |