-rw-r--r-- | cgit.h | 4 | ||||
-rw-r--r-- | cgitrc | 10 | ||||
-rw-r--r-- | shared.c | 14 | ||||
-rw-r--r-- | ui-log.c | 33 |
4 files changed, 48 insertions, 13 deletions
@@ -25,32 +25,34 @@ typedef void (*linediff_fn)(char *line, int len); struct cacheitem { char *name; struct stat st; int ttl; int fd; }; struct repoinfo { char *url; char *name; char *path; char *desc; char *owner; char *defbranch; char *module_link; int snapshots; + int enable_log_filecount; + int enable_log_linecount; }; struct repolist { int length; int count; struct repoinfo *repos; }; struct commitinfo { struct commit *commit; char *author; char *author_email; unsigned long author_date; char *committer; char *committer_email; unsigned long committer_date; @@ -68,32 +70,34 @@ struct taginfo { extern const char cgit_version[]; extern struct repolist cgit_repolist; extern struct repoinfo *cgit_repo; extern char *cgit_root_title; extern char *cgit_css; extern char *cgit_logo; extern char *cgit_logo_link; extern char *cgit_module_link; extern char *cgit_virtual_root; extern char *cgit_script_name; extern char *cgit_cache_root; extern int cgit_nocache; extern int cgit_snapshots; +extern int cgit_enable_log_filecount; +extern int cgit_enable_log_linecount; extern int cgit_max_lock_attempts; extern int cgit_cache_root_ttl; extern int cgit_cache_repo_ttl; extern int cgit_cache_dynamic_ttl; extern int cgit_cache_static_ttl; extern int cgit_cache_max_create_time; extern int cgit_max_msg_len; extern int cgit_max_repodesc_len; extern int cgit_max_commit_count; extern char *cgit_repo_name; extern char *cgit_repo_desc; extern char *cgit_repo_owner; extern int cgit_query_has_symref; @@ -1,30 +1,38 @@ ## ## cgitrc: template for /etc/cgitrc ## ## Uncomment and set to 1 to deactivate caching of generated pages. Mostly ## usefull for testing. #nocache=0 ## Enable/disable snapshots by default. This can be overridden per repo #snapshots=0 +## Enable/disable display of 'number of files changed' in log view +#enable-log-filecount=0 + + +## Enable/disable display of 'number of lines changed' in log view +#enable-log-linecount=0 + + ## Specify a root for virtual urls. This makes cgit generate urls like ## ## http://localhost/git/repo/log/?id=master ## ## instead of ## ## http://localhost/cgit/cgit.cgi?r=repo&p=log&id=master ## ## For this to work with apache, rewrite rules must be added to httpd.conf, ## possibly looking something like this: ## ## RewriteRule ^/git/$ /cgit/cgit.cgi [L,QSA] ## RewriteRule ^/git/([^/]+)/$ /cgit/cgit.cgi?r=$1 [L,QSA] ## RewriteRule ^/git/([^/]+)/([^/]+)/$ /cgit/cgit.cgi?r=$1&p=$2 [L,QSA] ## ## This setting is disabled by default. @@ -84,17 +92,19 @@ ## ttl for other dynamic pages #cache-dynamic-ttl=5 ## ttl for static pages (addressed by SHA-1) #cache-static-ttl=-1 ## Example repository entry. Required values are repo.url and repo.path (each ## repository section must start with repo.url). #repo.url=cgit #repo.name=cgit #repo.desc=the caching cgi for git #repo.path=/pub/git/cgit #repo.owner=Lars Hjemli #repo.snapshots=1 # override a sitewide snapshot-setting +#repo.enable-log-filecount=0 # override the default filecount setting +#repo.enable-log-linecount=0 # override the default linecount setting #repo.module-link=/git/%s/commit/?id=%s # override the standard module-link @@ -9,32 +9,34 @@ #include "cgit.h" struct repolist cgit_repolist; struct repoinfo *cgit_repo; char *cgit_root_title = "Git repository browser"; char *cgit_css = "/cgit.css"; char *cgit_logo = "/git-logo.png"; char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/"; char *cgit_module_link = "./?repo=%s&page=commit&id=%s"; char *cgit_virtual_root = NULL; char *cgit_script_name = CGIT_SCRIPT_NAME; char *cgit_cache_root = "/var/cache/cgit"; int cgit_nocache = 0; int cgit_snapshots = 0; +int cgit_enable_log_filecount = 0; +int cgit_enable_log_linecount = 0; int cgit_max_lock_attempts = 5; int cgit_cache_root_ttl = 5; int cgit_cache_repo_ttl = 5; int cgit_cache_dynamic_ttl = 5; int cgit_cache_static_ttl = -1; int cgit_cache_max_create_time = 5; int cgit_max_msg_len = 60; int cgit_max_repodesc_len = 60; int cgit_max_commit_count = 50; int cgit_query_has_symref = 0; int cgit_query_has_sha1 = 0; char *cgit_querystring = NULL; char *cgit_query_repo = NULL; @@ -72,84 +74,94 @@ struct repoinfo *add_repo(const char *url) cgit_repolist.length = 8; else cgit_repolist.length *= 2; cgit_repolist.repos = xrealloc(cgit_repolist.repos, cgit_repolist.length * sizeof(struct repoinfo)); } ret = &cgit_repolist.repos[cgit_repolist.count-1]; ret->url = xstrdup(url); ret->name = ret->url; ret->path = NULL; ret->desc = NULL; ret->owner = NULL; ret->defbranch = "master"; ret->snapshots = cgit_snapshots; + ret->enable_log_filecount = cgit_enable_log_filecount; + ret->enable_log_linecount = cgit_enable_log_linecount; ret->module_link = cgit_module_link; return ret; } void cgit_global_config_cb(const char *name, const char *value) { if (!strcmp(name, "root-title")) cgit_root_title = xstrdup(value); else if (!strcmp(name, "css")) cgit_css = xstrdup(value); else if (!strcmp(name, "logo")) cgit_logo = xstrdup(value); else if (!strcmp(name, "logo-link")) cgit_logo_link = xstrdup(value); else if (!strcmp(name, "module-link")) cgit_module_link = xstrdup(value); else if (!strcmp(name, "virtual-root")) cgit_virtual_root = xstrdup(value); else if (!strcmp(name, "nocache")) cgit_nocache = atoi(value); else if (!strcmp(name, "snapshots")) cgit_snapshots = atoi(value); + else if (!strcmp(name, "enable-log-filecount")) + cgit_enable_log_filecount = atoi(value); + else if (!strcmp(name, "enable-log-linecount")) + cgit_enable_log_linecount = atoi(value); else if (!strcmp(name, "cache-root")) cgit_cache_root = xstrdup(value); else if (!strcmp(name, "cache-root-ttl")) cgit_cache_root_ttl = atoi(value); else if (!strcmp(name, "cache-repo-ttl")) cgit_cache_repo_ttl = atoi(value); else if (!strcmp(name, "cache-static-ttl")) cgit_cache_static_ttl = atoi(value); else if (!strcmp(name, "cache-dynamic-ttl")) cgit_cache_dynamic_ttl = atoi(value); else if (!strcmp(name, "max-message-length")) cgit_max_msg_len = atoi(value); else if (!strcmp(name, "max-repodesc-length")) cgit_max_repodesc_len = atoi(value); else if (!strcmp(name, "max-commit-count")) cgit_max_commit_count = atoi(value); else if (!strcmp(name, "repo.url")) cgit_repo = add_repo(value); else if (!strcmp(name, "repo.name")) cgit_repo->name = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.path")) cgit_repo->path = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.desc")) cgit_repo->desc = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.owner")) cgit_repo->owner = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.defbranch")) cgit_repo->defbranch = xstrdup(value); else if (cgit_repo && !strcmp(name, "repo.snapshots")) - cgit_repo->snapshots = atoi(value); + cgit_repo->snapshots = cgit_snapshots * atoi(value); + else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount")) + cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value); + else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount")) + cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value); else if (cgit_repo && !strcmp(name, "repo.module-link")) cgit_repo->module_link= xstrdup(value); else if (!strcmp(name, "include")) cgit_read_config(value, cgit_global_config_cb); } void cgit_querystring_cb(const char *name, const char *value) { if (!strcmp(name,"r")) { cgit_query_repo = xstrdup(value); } else if (!strcmp(name, "p")) { cgit_query_page = xstrdup(value); } else if (!strcmp(name, "q")) { cgit_query_search = xstrdup(value); } else if (!strcmp(name, "h")) { cgit_query_head = xstrdup(value); @@ -6,59 +6,64 @@ * (see COPYING for full license text) */ #include "cgit.h" int files, lines; void count_lines(char *line, int size) { if (size>0 && (line[0] == '+' || line[0] == '-')) lines++; } void inspect_files(struct diff_filepair *pair) { files++; - cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); + if (cgit_repo->enable_log_linecount) + cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); } void print_commit(struct commit *commit) { char buf[32]; struct commitinfo *info; struct tm *time; info = cgit_parse_commit(commit); time = gmtime(&commit->date); html("<tr><td>"); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M", time); html_txt(buf); html("</td><td>"); char *qry = fmt("h=%s", sha1_to_hex(commit->object.sha1)); char *url = cgit_pageurl(cgit_query_repo, "commit", qry); html_link_open(url, NULL, NULL); html_ntxt(cgit_max_msg_len, info->subject); html_link_close(); - files = 0; - lines = 0; - cgit_diff_commit(commit, inspect_files); - html("</td><td class='right'>"); - htmlf("%d", files); - html("</td><td class='right'>"); - htmlf("%d", lines); + if (cgit_repo->enable_log_filecount) { + files = 0; + lines = 0; + cgit_diff_commit(commit, inspect_files); + html("</td><td class='right'>"); + htmlf("%d", files); + if (cgit_repo->enable_log_linecount) { + html("</td><td class='right'>"); + htmlf("%d", lines); + } + } html("</td><td>"); html_txt(info->author); html("</td></tr>\n"); cgit_free_commitinfo(info); } void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path) { struct rev_info rev; struct commit *commit; const char *argv[] = {NULL, tip, NULL, NULL, NULL}; int argc = 2; int i; if (grep) @@ -68,36 +73,40 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path) argv[argc++] = path; } init_revisions(&rev, NULL); rev.abbrev = DEFAULT_ABBREV; rev.commit_format = CMIT_FMT_DEFAULT; rev.verbose_header = 1; rev.show_root_diff = 0; setup_revisions(argc, argv, &rev, NULL); if (rev.grep_filter) { rev.grep_filter->regflags |= REG_ICASE; compile_grep_patterns(rev.grep_filter); } prepare_revision_walk(&rev); html("<table class='list nowrap'>"); html("<tr class='nohover'><th class='left'>Date</th>" - "<th class='left'>Message</th>" - "<th class='left'>Files</th>" - "<th class='left'>Lines</th>" - "<th class='left'>Author</th></tr>\n"); + "<th class='left'>Message</th>"); + + if (cgit_repo->enable_log_filecount) { + html("<th class='left'>Files</th>"); + if (cgit_repo->enable_log_linecount) + html("<th class='left'>Lines</th>"); + } + html("<th class='left'>Author</th></tr>\n"); if (ofs<0) ofs = 0; for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) { free(commit->buffer); commit->buffer = NULL; free_commit_list(commit->parents); commit->parents = NULL; } for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) { print_commit(commit); free(commit->buffer); commit->buffer = NULL; free_commit_list(commit->parents); |