summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2007-05-18 11:55:52 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-18 11:55:52 (UTC)
commite189344a7dfe6fa1b07434d5170e6441dcbaf788 (patch) (unidiff)
treef1500b97f95a710dba27469510114388be435d01
parentc1ad6cb77889880ad0189a689840fbfa6e5cbc80 (diff)
downloadcgit-e189344a7dfe6fa1b07434d5170e6441dcbaf788.zip
cgit-e189344a7dfe6fa1b07434d5170e6441dcbaf788.tar.gz
cgit-e189344a7dfe6fa1b07434d5170e6441dcbaf788.tar.bz2
Add knobs to enable/disable files/lines changed in log view
These columns can cause lots of IO on the server, so add settings to explicitly enable them. Also, add per repo settings to optionally disable the columns if sitewide enabled. While at it, do not allow repo.snapshot to enable snapshots if the global setting is disabled. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.h4
-rw-r--r--cgitrc10
-rw-r--r--shared.c14
-rw-r--r--ui-log.c33
4 files changed, 48 insertions, 13 deletions
diff --git a/cgit.h b/cgit.h
index 290401f..ed100a7 100644
--- a/cgit.h
+++ b/cgit.h
@@ -9,107 +9,111 @@
9#include <tree.h> 9#include <tree.h>
10#include <commit.h> 10#include <commit.h>
11#include <tag.h> 11#include <tag.h>
12#include <diff.h> 12#include <diff.h>
13#include <diffcore.h> 13#include <diffcore.h>
14#include <refs.h> 14#include <refs.h>
15#include <revision.h> 15#include <revision.h>
16#include <log-tree.h> 16#include <log-tree.h>
17#include <archive.h> 17#include <archive.h>
18#include <xdiff/xdiff.h> 18#include <xdiff/xdiff.h>
19 19
20 20
21typedef void (*configfn)(const char *name, const char *value); 21typedef void (*configfn)(const char *name, const char *value);
22typedef void (*filepair_fn)(struct diff_filepair *pair); 22typedef void (*filepair_fn)(struct diff_filepair *pair);
23typedef void (*linediff_fn)(char *line, int len); 23typedef void (*linediff_fn)(char *line, int len);
24 24
25struct cacheitem { 25struct cacheitem {
26 char *name; 26 char *name;
27 struct stat st; 27 struct stat st;
28 int ttl; 28 int ttl;
29 int fd; 29 int fd;
30}; 30};
31 31
32struct repoinfo { 32struct repoinfo {
33 char *url; 33 char *url;
34 char *name; 34 char *name;
35 char *path; 35 char *path;
36 char *desc; 36 char *desc;
37 char *owner; 37 char *owner;
38 char *defbranch; 38 char *defbranch;
39 char *module_link; 39 char *module_link;
40 int snapshots; 40 int snapshots;
41 int enable_log_filecount;
42 int enable_log_linecount;
41}; 43};
42 44
43struct repolist { 45struct repolist {
44 int length; 46 int length;
45 int count; 47 int count;
46 struct repoinfo *repos; 48 struct repoinfo *repos;
47}; 49};
48 50
49struct commitinfo { 51struct commitinfo {
50 struct commit *commit; 52 struct commit *commit;
51 char *author; 53 char *author;
52 char *author_email; 54 char *author_email;
53 unsigned long author_date; 55 unsigned long author_date;
54 char *committer; 56 char *committer;
55 char *committer_email; 57 char *committer_email;
56 unsigned long committer_date; 58 unsigned long committer_date;
57 char *subject; 59 char *subject;
58 char *msg; 60 char *msg;
59}; 61};
60 62
61struct taginfo { 63struct taginfo {
62 char *tagger; 64 char *tagger;
63 char *tagger_email; 65 char *tagger_email;
64 int tagger_date; 66 int tagger_date;
65 char *msg; 67 char *msg;
66}; 68};
67 69
68extern const char cgit_version[]; 70extern const char cgit_version[];
69 71
70extern struct repolist cgit_repolist; 72extern struct repolist cgit_repolist;
71extern struct repoinfo *cgit_repo; 73extern struct repoinfo *cgit_repo;
72 74
73extern char *cgit_root_title; 75extern char *cgit_root_title;
74extern char *cgit_css; 76extern char *cgit_css;
75extern char *cgit_logo; 77extern char *cgit_logo;
76extern char *cgit_logo_link; 78extern char *cgit_logo_link;
77extern char *cgit_module_link; 79extern char *cgit_module_link;
78extern char *cgit_virtual_root; 80extern char *cgit_virtual_root;
79extern char *cgit_script_name; 81extern char *cgit_script_name;
80extern char *cgit_cache_root; 82extern char *cgit_cache_root;
81 83
82extern int cgit_nocache; 84extern int cgit_nocache;
83extern int cgit_snapshots; 85extern int cgit_snapshots;
86extern int cgit_enable_log_filecount;
87extern int cgit_enable_log_linecount;
84extern int cgit_max_lock_attempts; 88extern int cgit_max_lock_attempts;
85extern int cgit_cache_root_ttl; 89extern int cgit_cache_root_ttl;
86extern int cgit_cache_repo_ttl; 90extern int cgit_cache_repo_ttl;
87extern int cgit_cache_dynamic_ttl; 91extern int cgit_cache_dynamic_ttl;
88extern int cgit_cache_static_ttl; 92extern int cgit_cache_static_ttl;
89extern int cgit_cache_max_create_time; 93extern int cgit_cache_max_create_time;
90 94
91extern int cgit_max_msg_len; 95extern int cgit_max_msg_len;
92extern int cgit_max_repodesc_len; 96extern int cgit_max_repodesc_len;
93extern int cgit_max_commit_count; 97extern int cgit_max_commit_count;
94 98
95extern char *cgit_repo_name; 99extern char *cgit_repo_name;
96extern char *cgit_repo_desc; 100extern char *cgit_repo_desc;
97extern char *cgit_repo_owner; 101extern char *cgit_repo_owner;
98 102
99extern int cgit_query_has_symref; 103extern int cgit_query_has_symref;
100extern int cgit_query_has_sha1; 104extern int cgit_query_has_sha1;
101 105
102extern char *cgit_querystring; 106extern char *cgit_querystring;
103extern char *cgit_query_repo; 107extern char *cgit_query_repo;
104extern char *cgit_query_page; 108extern char *cgit_query_page;
105extern char *cgit_query_search; 109extern char *cgit_query_search;
106extern char *cgit_query_head; 110extern char *cgit_query_head;
107extern char *cgit_query_sha1; 111extern char *cgit_query_sha1;
108extern char *cgit_query_sha2; 112extern char *cgit_query_sha2;
109extern char *cgit_query_path; 113extern char *cgit_query_path;
110extern char *cgit_query_name; 114extern char *cgit_query_name;
111extern int cgit_query_ofs; 115extern int cgit_query_ofs;
112 116
113extern int htmlfd; 117extern int htmlfd;
114 118
115extern void cgit_global_config_cb(const char *name, const char *value); 119extern void cgit_global_config_cb(const char *name, const char *value);
diff --git a/cgitrc b/cgitrc
index f923cc4..eaa9ce3 100644
--- a/cgitrc
+++ b/cgitrc
@@ -1,46 +1,54 @@
1## 1##
2## cgitrc: template for /etc/cgitrc 2## cgitrc: template for /etc/cgitrc
3## 3##
4 4
5 5
6## Uncomment and set to 1 to deactivate caching of generated pages. Mostly 6## Uncomment and set to 1 to deactivate caching of generated pages. Mostly
7## usefull for testing. 7## usefull for testing.
8#nocache=0 8#nocache=0
9 9
10 10
11## Enable/disable snapshots by default. This can be overridden per repo 11## Enable/disable snapshots by default. This can be overridden per repo
12#snapshots=0 12#snapshots=0
13 13
14 14
15## Enable/disable display of 'number of files changed' in log view
16#enable-log-filecount=0
17
18
19## Enable/disable display of 'number of lines changed' in log view
20#enable-log-linecount=0
21
22
15## Specify a root for virtual urls. This makes cgit generate urls like 23## Specify a root for virtual urls. This makes cgit generate urls like
16## 24##
17## http://localhost/git/repo/log/?id=master 25## http://localhost/git/repo/log/?id=master
18## 26##
19## instead of 27## instead of
20## 28##
21## http://localhost/cgit/cgit.cgi?r=repo&p=log&id=master 29## http://localhost/cgit/cgit.cgi?r=repo&p=log&id=master
22## 30##
23## For this to work with apache, rewrite rules must be added to httpd.conf, 31## For this to work with apache, rewrite rules must be added to httpd.conf,
24## possibly looking something like this: 32## possibly looking something like this:
25## 33##
26## RewriteRule ^/git/$ /cgit/cgit.cgi [L,QSA] 34## RewriteRule ^/git/$ /cgit/cgit.cgi [L,QSA]
27## RewriteRule ^/git/([^/]+)/$ /cgit/cgit.cgi?r=$1 [L,QSA] 35## RewriteRule ^/git/([^/]+)/$ /cgit/cgit.cgi?r=$1 [L,QSA]
28## RewriteRule ^/git/([^/]+)/([^/]+)/$ /cgit/cgit.cgi?r=$1&p=$2 [L,QSA] 36## RewriteRule ^/git/([^/]+)/([^/]+)/$ /cgit/cgit.cgi?r=$1&p=$2 [L,QSA]
29## 37##
30## This setting is disabled by default. 38## This setting is disabled by default.
31#virtual-root=/git 39#virtual-root=/git
32 40
33 41
34## Set the title printed on the root page 42## Set the title printed on the root page
35#root-title=Git repository browser 43#root-title=Git repository browser
36 44
37 45
38## Link to css file 46## Link to css file
39#css=/cgit/cgit.css 47#css=/cgit/cgit.css
40 48
41 49
42## Link to logo file 50## Link to logo file
43#logo=/cgit/git-logo.png 51#logo=/cgit/git-logo.png
44 52
45 53
46## Url loaded when clicking the logo 54## Url loaded when clicking the logo
@@ -68,33 +76,35 @@
68 76
69 77
70## Include another config-file 78## Include another config-file
71#include=/var/cgit/repolist 79#include=/var/cgit/repolist
72 80
73## 81##
74## Time-To-Live settings: specifies how long (in minutes) different pages 82## Time-To-Live settings: specifies how long (in minutes) different pages
75## should be cached (0 for instant expiration, -1 for immortal pages) 83## should be cached (0 for instant expiration, -1 for immortal pages)
76## 84##
77 85
78## ttl for root page 86## ttl for root page
79#cache-root-ttl=5 87#cache-root-ttl=5
80 88
81## ttl for repo summary page 89## ttl for repo summary page
82#cache-repo-ttl=5 90#cache-repo-ttl=5
83 91
84## ttl for other dynamic pages 92## ttl for other dynamic pages
85#cache-dynamic-ttl=5 93#cache-dynamic-ttl=5
86 94
87## ttl for static pages (addressed by SHA-1) 95## ttl for static pages (addressed by SHA-1)
88#cache-static-ttl=-1 96#cache-static-ttl=-1
89 97
90 98
91 99
92## Example repository entry. Required values are repo.url and repo.path (each 100## Example repository entry. Required values are repo.url and repo.path (each
93## repository section must start with repo.url). 101## repository section must start with repo.url).
94#repo.url=cgit 102#repo.url=cgit
95#repo.name=cgit 103#repo.name=cgit
96#repo.desc=the caching cgi for git 104#repo.desc=the caching cgi for git
97#repo.path=/pub/git/cgit 105#repo.path=/pub/git/cgit
98#repo.owner=Lars Hjemli 106#repo.owner=Lars Hjemli
99 #repo.snapshots=1 # override a sitewide snapshot-setting 107 #repo.snapshots=1 # override a sitewide snapshot-setting
108 #repo.enable-log-filecount=0 # override the default filecount setting
109 #repo.enable-log-linecount=0 # override the default linecount setting
100 #repo.module-link=/git/%s/commit/?id=%s # override the standard module-link 110 #repo.module-link=/git/%s/commit/?id=%s # override the standard module-link
diff --git a/shared.c b/shared.c
index 752ceac..53cd9b0 100644
--- a/shared.c
+++ b/shared.c
@@ -1,171 +1,183 @@
1/* shared.c: global vars + some callback functions 1/* shared.c: global vars + some callback functions
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11struct repolist cgit_repolist; 11struct repolist cgit_repolist;
12struct repoinfo *cgit_repo; 12struct repoinfo *cgit_repo;
13 13
14char *cgit_root_title = "Git repository browser"; 14char *cgit_root_title = "Git repository browser";
15char *cgit_css = "/cgit.css"; 15char *cgit_css = "/cgit.css";
16char *cgit_logo = "/git-logo.png"; 16char *cgit_logo = "/git-logo.png";
17char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/"; 17char *cgit_logo_link = "http://www.kernel.org/pub/software/scm/git/docs/";
18char *cgit_module_link = "./?repo=%s&page=commit&id=%s"; 18char *cgit_module_link = "./?repo=%s&page=commit&id=%s";
19char *cgit_virtual_root = NULL; 19char *cgit_virtual_root = NULL;
20char *cgit_script_name = CGIT_SCRIPT_NAME; 20char *cgit_script_name = CGIT_SCRIPT_NAME;
21char *cgit_cache_root = "/var/cache/cgit"; 21char *cgit_cache_root = "/var/cache/cgit";
22 22
23int cgit_nocache = 0; 23int cgit_nocache = 0;
24int cgit_snapshots = 0; 24int cgit_snapshots = 0;
25int cgit_enable_log_filecount = 0;
26int cgit_enable_log_linecount = 0;
25int cgit_max_lock_attempts = 5; 27int cgit_max_lock_attempts = 5;
26int cgit_cache_root_ttl = 5; 28int cgit_cache_root_ttl = 5;
27int cgit_cache_repo_ttl = 5; 29int cgit_cache_repo_ttl = 5;
28int cgit_cache_dynamic_ttl = 5; 30int cgit_cache_dynamic_ttl = 5;
29int cgit_cache_static_ttl = -1; 31int cgit_cache_static_ttl = -1;
30int cgit_cache_max_create_time = 5; 32int cgit_cache_max_create_time = 5;
31 33
32int cgit_max_msg_len = 60; 34int cgit_max_msg_len = 60;
33int cgit_max_repodesc_len = 60; 35int cgit_max_repodesc_len = 60;
34int cgit_max_commit_count = 50; 36int cgit_max_commit_count = 50;
35 37
36int cgit_query_has_symref = 0; 38int cgit_query_has_symref = 0;
37int cgit_query_has_sha1 = 0; 39int cgit_query_has_sha1 = 0;
38 40
39char *cgit_querystring = NULL; 41char *cgit_querystring = NULL;
40char *cgit_query_repo = NULL; 42char *cgit_query_repo = NULL;
41char *cgit_query_page = NULL; 43char *cgit_query_page = NULL;
42char *cgit_query_head = NULL; 44char *cgit_query_head = NULL;
43char *cgit_query_search = NULL; 45char *cgit_query_search = NULL;
44char *cgit_query_sha1 = NULL; 46char *cgit_query_sha1 = NULL;
45char *cgit_query_sha2 = NULL; 47char *cgit_query_sha2 = NULL;
46char *cgit_query_path = NULL; 48char *cgit_query_path = NULL;
47char *cgit_query_name = NULL; 49char *cgit_query_name = NULL;
48int cgit_query_ofs = 0; 50int cgit_query_ofs = 0;
49 51
50int htmlfd = 0; 52int htmlfd = 0;
51 53
52int chk_zero(int result, char *msg) 54int chk_zero(int result, char *msg)
53{ 55{
54 if (result != 0) 56 if (result != 0)
55 die("%s: %s", msg, strerror(errno)); 57 die("%s: %s", msg, strerror(errno));
56 return result; 58 return result;
57} 59}
58 60
59int chk_positive(int result, char *msg) 61int chk_positive(int result, char *msg)
60{ 62{
61 if (result <= 0) 63 if (result <= 0)
62 die("%s: %s", msg, strerror(errno)); 64 die("%s: %s", msg, strerror(errno));
63 return result; 65 return result;
64} 66}
65 67
66struct repoinfo *add_repo(const char *url) 68struct repoinfo *add_repo(const char *url)
67{ 69{
68 struct repoinfo *ret; 70 struct repoinfo *ret;
69 71
70 if (++cgit_repolist.count > cgit_repolist.length) { 72 if (++cgit_repolist.count > cgit_repolist.length) {
71 if (cgit_repolist.length == 0) 73 if (cgit_repolist.length == 0)
72 cgit_repolist.length = 8; 74 cgit_repolist.length = 8;
73 else 75 else
74 cgit_repolist.length *= 2; 76 cgit_repolist.length *= 2;
75 cgit_repolist.repos = xrealloc(cgit_repolist.repos, 77 cgit_repolist.repos = xrealloc(cgit_repolist.repos,
76 cgit_repolist.length * 78 cgit_repolist.length *
77 sizeof(struct repoinfo)); 79 sizeof(struct repoinfo));
78 } 80 }
79 81
80 ret = &cgit_repolist.repos[cgit_repolist.count-1]; 82 ret = &cgit_repolist.repos[cgit_repolist.count-1];
81 ret->url = xstrdup(url); 83 ret->url = xstrdup(url);
82 ret->name = ret->url; 84 ret->name = ret->url;
83 ret->path = NULL; 85 ret->path = NULL;
84 ret->desc = NULL; 86 ret->desc = NULL;
85 ret->owner = NULL; 87 ret->owner = NULL;
86 ret->defbranch = "master"; 88 ret->defbranch = "master";
87 ret->snapshots = cgit_snapshots; 89 ret->snapshots = cgit_snapshots;
90 ret->enable_log_filecount = cgit_enable_log_filecount;
91 ret->enable_log_linecount = cgit_enable_log_linecount;
88 ret->module_link = cgit_module_link; 92 ret->module_link = cgit_module_link;
89 return ret; 93 return ret;
90} 94}
91 95
92void cgit_global_config_cb(const char *name, const char *value) 96void cgit_global_config_cb(const char *name, const char *value)
93{ 97{
94 if (!strcmp(name, "root-title")) 98 if (!strcmp(name, "root-title"))
95 cgit_root_title = xstrdup(value); 99 cgit_root_title = xstrdup(value);
96 else if (!strcmp(name, "css")) 100 else if (!strcmp(name, "css"))
97 cgit_css = xstrdup(value); 101 cgit_css = xstrdup(value);
98 else if (!strcmp(name, "logo")) 102 else if (!strcmp(name, "logo"))
99 cgit_logo = xstrdup(value); 103 cgit_logo = xstrdup(value);
100 else if (!strcmp(name, "logo-link")) 104 else if (!strcmp(name, "logo-link"))
101 cgit_logo_link = xstrdup(value); 105 cgit_logo_link = xstrdup(value);
102 else if (!strcmp(name, "module-link")) 106 else if (!strcmp(name, "module-link"))
103 cgit_module_link = xstrdup(value); 107 cgit_module_link = xstrdup(value);
104 else if (!strcmp(name, "virtual-root")) 108 else if (!strcmp(name, "virtual-root"))
105 cgit_virtual_root = xstrdup(value); 109 cgit_virtual_root = xstrdup(value);
106 else if (!strcmp(name, "nocache")) 110 else if (!strcmp(name, "nocache"))
107 cgit_nocache = atoi(value); 111 cgit_nocache = atoi(value);
108 else if (!strcmp(name, "snapshots")) 112 else if (!strcmp(name, "snapshots"))
109 cgit_snapshots = atoi(value); 113 cgit_snapshots = atoi(value);
114 else if (!strcmp(name, "enable-log-filecount"))
115 cgit_enable_log_filecount = atoi(value);
116 else if (!strcmp(name, "enable-log-linecount"))
117 cgit_enable_log_linecount = atoi(value);
110 else if (!strcmp(name, "cache-root")) 118 else if (!strcmp(name, "cache-root"))
111 cgit_cache_root = xstrdup(value); 119 cgit_cache_root = xstrdup(value);
112 else if (!strcmp(name, "cache-root-ttl")) 120 else if (!strcmp(name, "cache-root-ttl"))
113 cgit_cache_root_ttl = atoi(value); 121 cgit_cache_root_ttl = atoi(value);
114 else if (!strcmp(name, "cache-repo-ttl")) 122 else if (!strcmp(name, "cache-repo-ttl"))
115 cgit_cache_repo_ttl = atoi(value); 123 cgit_cache_repo_ttl = atoi(value);
116 else if (!strcmp(name, "cache-static-ttl")) 124 else if (!strcmp(name, "cache-static-ttl"))
117 cgit_cache_static_ttl = atoi(value); 125 cgit_cache_static_ttl = atoi(value);
118 else if (!strcmp(name, "cache-dynamic-ttl")) 126 else if (!strcmp(name, "cache-dynamic-ttl"))
119 cgit_cache_dynamic_ttl = atoi(value); 127 cgit_cache_dynamic_ttl = atoi(value);
120 else if (!strcmp(name, "max-message-length")) 128 else if (!strcmp(name, "max-message-length"))
121 cgit_max_msg_len = atoi(value); 129 cgit_max_msg_len = atoi(value);
122 else if (!strcmp(name, "max-repodesc-length")) 130 else if (!strcmp(name, "max-repodesc-length"))
123 cgit_max_repodesc_len = atoi(value); 131 cgit_max_repodesc_len = atoi(value);
124 else if (!strcmp(name, "max-commit-count")) 132 else if (!strcmp(name, "max-commit-count"))
125 cgit_max_commit_count = atoi(value); 133 cgit_max_commit_count = atoi(value);
126 else if (!strcmp(name, "repo.url")) 134 else if (!strcmp(name, "repo.url"))
127 cgit_repo = add_repo(value); 135 cgit_repo = add_repo(value);
128 else if (!strcmp(name, "repo.name")) 136 else if (!strcmp(name, "repo.name"))
129 cgit_repo->name = xstrdup(value); 137 cgit_repo->name = xstrdup(value);
130 else if (cgit_repo && !strcmp(name, "repo.path")) 138 else if (cgit_repo && !strcmp(name, "repo.path"))
131 cgit_repo->path = xstrdup(value); 139 cgit_repo->path = xstrdup(value);
132 else if (cgit_repo && !strcmp(name, "repo.desc")) 140 else if (cgit_repo && !strcmp(name, "repo.desc"))
133 cgit_repo->desc = xstrdup(value); 141 cgit_repo->desc = xstrdup(value);
134 else if (cgit_repo && !strcmp(name, "repo.owner")) 142 else if (cgit_repo && !strcmp(name, "repo.owner"))
135 cgit_repo->owner = xstrdup(value); 143 cgit_repo->owner = xstrdup(value);
136 else if (cgit_repo && !strcmp(name, "repo.defbranch")) 144 else if (cgit_repo && !strcmp(name, "repo.defbranch"))
137 cgit_repo->defbranch = xstrdup(value); 145 cgit_repo->defbranch = xstrdup(value);
138 else if (cgit_repo && !strcmp(name, "repo.snapshots")) 146 else if (cgit_repo && !strcmp(name, "repo.snapshots"))
139 cgit_repo->snapshots = atoi(value); 147 cgit_repo->snapshots = cgit_snapshots * atoi(value);
148 else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
149 cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
150 else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
151 cgit_repo->enable_log_linecount = cgit_enable_log_linecount * atoi(value);
140 else if (cgit_repo && !strcmp(name, "repo.module-link")) 152 else if (cgit_repo && !strcmp(name, "repo.module-link"))
141 cgit_repo->module_link= xstrdup(value); 153 cgit_repo->module_link= xstrdup(value);
142 else if (!strcmp(name, "include")) 154 else if (!strcmp(name, "include"))
143 cgit_read_config(value, cgit_global_config_cb); 155 cgit_read_config(value, cgit_global_config_cb);
144} 156}
145 157
146void cgit_querystring_cb(const char *name, const char *value) 158void cgit_querystring_cb(const char *name, const char *value)
147{ 159{
148 if (!strcmp(name,"r")) { 160 if (!strcmp(name,"r")) {
149 cgit_query_repo = xstrdup(value); 161 cgit_query_repo = xstrdup(value);
150 } else if (!strcmp(name, "p")) { 162 } else if (!strcmp(name, "p")) {
151 cgit_query_page = xstrdup(value); 163 cgit_query_page = xstrdup(value);
152 } else if (!strcmp(name, "q")) { 164 } else if (!strcmp(name, "q")) {
153 cgit_query_search = xstrdup(value); 165 cgit_query_search = xstrdup(value);
154 } else if (!strcmp(name, "h")) { 166 } else if (!strcmp(name, "h")) {
155 cgit_query_head = xstrdup(value); 167 cgit_query_head = xstrdup(value);
156 cgit_query_has_symref = 1; 168 cgit_query_has_symref = 1;
157 } else if (!strcmp(name, "id")) { 169 } else if (!strcmp(name, "id")) {
158 cgit_query_sha1 = xstrdup(value); 170 cgit_query_sha1 = xstrdup(value);
159 cgit_query_has_sha1 = 1; 171 cgit_query_has_sha1 = 1;
160 } else if (!strcmp(name, "id2")) { 172 } else if (!strcmp(name, "id2")) {
161 cgit_query_sha2 = xstrdup(value); 173 cgit_query_sha2 = xstrdup(value);
162 cgit_query_has_sha1 = 1; 174 cgit_query_has_sha1 = 1;
163 } else if (!strcmp(name, "ofs")) { 175 } else if (!strcmp(name, "ofs")) {
164 cgit_query_ofs = atoi(value); 176 cgit_query_ofs = atoi(value);
165 } else if (!strcmp(name, "path")) { 177 } else if (!strcmp(name, "path")) {
166 cgit_query_path = xstrdup(value); 178 cgit_query_path = xstrdup(value);
167 } else if (!strcmp(name, "name")) { 179 } else if (!strcmp(name, "name")) {
168 cgit_query_name = xstrdup(value); 180 cgit_query_name = xstrdup(value);
169 } 181 }
170} 182}
171 183
diff --git a/ui-log.c b/ui-log.c
index 9d0ec02..4237921 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -1,119 +1,128 @@
1/* ui-log.c: functions for log output 1/* ui-log.c: functions for log output
2 * 2 *
3 * Copyright (C) 2006 Lars Hjemli 3 * Copyright (C) 2006 Lars Hjemli
4 * 4 *
5 * Licensed under GNU General Public License v2 5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text) 6 * (see COPYING for full license text)
7 */ 7 */
8 8
9#include "cgit.h" 9#include "cgit.h"
10 10
11int files, lines; 11int files, lines;
12 12
13void count_lines(char *line, int size) 13void count_lines(char *line, int size)
14{ 14{
15 if (size>0 && (line[0] == '+' || line[0] == '-')) 15 if (size>0 && (line[0] == '+' || line[0] == '-'))
16 lines++; 16 lines++;
17} 17}
18 18
19void inspect_files(struct diff_filepair *pair) 19void inspect_files(struct diff_filepair *pair)
20{ 20{
21 files++; 21 files++;
22 cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); 22 if (cgit_repo->enable_log_linecount)
23 cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines);
23} 24}
24 25
25void print_commit(struct commit *commit) 26void print_commit(struct commit *commit)
26{ 27{
27 char buf[32]; 28 char buf[32];
28 struct commitinfo *info; 29 struct commitinfo *info;
29 struct tm *time; 30 struct tm *time;
30 31
31 info = cgit_parse_commit(commit); 32 info = cgit_parse_commit(commit);
32 time = gmtime(&commit->date); 33 time = gmtime(&commit->date);
33 html("<tr><td>"); 34 html("<tr><td>");
34 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M", time); 35 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M", time);
35 html_txt(buf); 36 html_txt(buf);
36 html("</td><td>"); 37 html("</td><td>");
37 char *qry = fmt("h=%s", sha1_to_hex(commit->object.sha1)); 38 char *qry = fmt("h=%s", sha1_to_hex(commit->object.sha1));
38 char *url = cgit_pageurl(cgit_query_repo, "commit", qry); 39 char *url = cgit_pageurl(cgit_query_repo, "commit", qry);
39 html_link_open(url, NULL, NULL); 40 html_link_open(url, NULL, NULL);
40 html_ntxt(cgit_max_msg_len, info->subject); 41 html_ntxt(cgit_max_msg_len, info->subject);
41 html_link_close(); 42 html_link_close();
42 files = 0; 43 if (cgit_repo->enable_log_filecount) {
43 lines = 0; 44 files = 0;
44 cgit_diff_commit(commit, inspect_files); 45 lines = 0;
45 html("</td><td class='right'>"); 46 cgit_diff_commit(commit, inspect_files);
46 htmlf("%d", files); 47 html("</td><td class='right'>");
47 html("</td><td class='right'>"); 48 htmlf("%d", files);
48 htmlf("%d", lines); 49 if (cgit_repo->enable_log_linecount) {
50 html("</td><td class='right'>");
51 htmlf("%d", lines);
52 }
53 }
49 html("</td><td>"); 54 html("</td><td>");
50 html_txt(info->author); 55 html_txt(info->author);
51 html("</td></tr>\n"); 56 html("</td></tr>\n");
52 cgit_free_commitinfo(info); 57 cgit_free_commitinfo(info);
53} 58}
54 59
55 60
56void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path) 61void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path)
57{ 62{
58 struct rev_info rev; 63 struct rev_info rev;
59 struct commit *commit; 64 struct commit *commit;
60 const char *argv[] = {NULL, tip, NULL, NULL, NULL}; 65 const char *argv[] = {NULL, tip, NULL, NULL, NULL};
61 int argc = 2; 66 int argc = 2;
62 int i; 67 int i;
63 68
64 if (grep) 69 if (grep)
65 argv[argc++] = fmt("--grep=%s", grep); 70 argv[argc++] = fmt("--grep=%s", grep);
66 if (path) { 71 if (path) {
67 argv[argc++] = "--"; 72 argv[argc++] = "--";
68 argv[argc++] = path; 73 argv[argc++] = path;
69 } 74 }
70 init_revisions(&rev, NULL); 75 init_revisions(&rev, NULL);
71 rev.abbrev = DEFAULT_ABBREV; 76 rev.abbrev = DEFAULT_ABBREV;
72 rev.commit_format = CMIT_FMT_DEFAULT; 77 rev.commit_format = CMIT_FMT_DEFAULT;
73 rev.verbose_header = 1; 78 rev.verbose_header = 1;
74 rev.show_root_diff = 0; 79 rev.show_root_diff = 0;
75 setup_revisions(argc, argv, &rev, NULL); 80 setup_revisions(argc, argv, &rev, NULL);
76 if (rev.grep_filter) { 81 if (rev.grep_filter) {
77 rev.grep_filter->regflags |= REG_ICASE; 82 rev.grep_filter->regflags |= REG_ICASE;
78 compile_grep_patterns(rev.grep_filter); 83 compile_grep_patterns(rev.grep_filter);
79 } 84 }
80 prepare_revision_walk(&rev); 85 prepare_revision_walk(&rev);
81 86
82 html("<table class='list nowrap'>"); 87 html("<table class='list nowrap'>");
83 html("<tr class='nohover'><th class='left'>Date</th>" 88 html("<tr class='nohover'><th class='left'>Date</th>"
84 "<th class='left'>Message</th>" 89 "<th class='left'>Message</th>");
85 "<th class='left'>Files</th>" 90
86 "<th class='left'>Lines</th>" 91 if (cgit_repo->enable_log_filecount) {
87 "<th class='left'>Author</th></tr>\n"); 92 html("<th class='left'>Files</th>");
93 if (cgit_repo->enable_log_linecount)
94 html("<th class='left'>Lines</th>");
95 }
96 html("<th class='left'>Author</th></tr>\n");
88 97
89 if (ofs<0) 98 if (ofs<0)
90 ofs = 0; 99 ofs = 0;
91 100
92 for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) { 101 for (i = 0; i < ofs && (commit = get_revision(&rev)) != NULL; i++) {
93 free(commit->buffer); 102 free(commit->buffer);
94 commit->buffer = NULL; 103 commit->buffer = NULL;
95 free_commit_list(commit->parents); 104 free_commit_list(commit->parents);
96 commit->parents = NULL; 105 commit->parents = NULL;
97 } 106 }
98 107
99 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) { 108 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
100 print_commit(commit); 109 print_commit(commit);
101 free(commit->buffer); 110 free(commit->buffer);
102 commit->buffer = NULL; 111 commit->buffer = NULL;
103 free_commit_list(commit->parents); 112 free_commit_list(commit->parents);
104 commit->parents = NULL; 113 commit->parents = NULL;
105 } 114 }
106 html("</table>\n"); 115 html("</table>\n");
107 116
108 html("<div class='pager'>"); 117 html("<div class='pager'>");
109 if (ofs > 0) { 118 if (ofs > 0) {
110 html("&nbsp;<a href='"); 119 html("&nbsp;<a href='");
111 html(cgit_pageurl(cgit_query_repo, cgit_query_page, 120 html(cgit_pageurl(cgit_query_repo, cgit_query_page,
112 fmt("h=%s&ofs=%d", tip, ofs-cnt))); 121 fmt("h=%s&ofs=%d", tip, ofs-cnt)));
113 html("'>[prev]</a>&nbsp;"); 122 html("'>[prev]</a>&nbsp;");
114 } 123 }
115 124
116 if ((commit = get_revision(&rev)) != NULL) { 125 if ((commit = get_revision(&rev)) != NULL) {
117 html("&nbsp;<a href='"); 126 html("&nbsp;<a href='");
118 html(cgit_pageurl(cgit_query_repo, "log", 127 html(cgit_pageurl(cgit_query_repo, "log",
119 fmt("h=%s&ofs=%d", tip, ofs+cnt))); 128 fmt("h=%s&ofs=%d", tip, ofs+cnt)));