summaryrefslogtreecommitdiffabout
path: root/shared.c
authorLars Hjemli <hjemli@gmail.com>2007-05-13 15:15:06 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2007-05-13 15:15:06 (UTC)
commitc6cf3a424a0860d69b290254d9b19d35527b2d27 (patch) (unidiff)
tree2874f2c42e907cba1187ae32ee686daebc2de59e /shared.c
parent80e577c3ef2a73becabff7e9c9c242f317a87de9 (diff)
downloadcgit-c6cf3a424a0860d69b290254d9b19d35527b2d27.zip
cgit-c6cf3a424a0860d69b290254d9b19d35527b2d27.tar.gz
cgit-c6cf3a424a0860d69b290254d9b19d35527b2d27.tar.bz2
Add max-commit-count parameter to cgitrc
This enabled customizing number of commits shown per page in log view. It also changes the default from 100 to 50, mainly due to the more cpu intensive log pages (number of files/lines changed) but also since 100 log messages requires excessive scrolling. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'shared.c') (more/less context) (ignore whitespace changes)
-rw-r--r--shared.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/shared.c b/shared.c
index 801f68d..ffecac8 100644
--- a/shared.c
+++ b/shared.c
@@ -1,314 +1,317 @@
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;
20 20
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_max_lock_attempts = 5; 25int cgit_max_lock_attempts = 5;
26int cgit_cache_root_ttl = 5; 26int cgit_cache_root_ttl = 5;
27int cgit_cache_repo_ttl = 5; 27int cgit_cache_repo_ttl = 5;
28int cgit_cache_dynamic_ttl = 5; 28int cgit_cache_dynamic_ttl = 5;
29int cgit_cache_static_ttl = -1; 29int cgit_cache_static_ttl = -1;
30int cgit_cache_max_create_time = 5; 30int cgit_cache_max_create_time = 5;
31 31
32int cgit_max_msg_len = 60; 32int cgit_max_msg_len = 60;
33int cgit_max_commit_count = 50;
33 34
34char *cgit_repo_name = NULL; 35char *cgit_repo_name = NULL;
35char *cgit_repo_desc = NULL; 36char *cgit_repo_desc = NULL;
36char *cgit_repo_owner = NULL; 37char *cgit_repo_owner = NULL;
37 38
38int cgit_query_has_symref = 0; 39int cgit_query_has_symref = 0;
39int cgit_query_has_sha1 = 0; 40int cgit_query_has_sha1 = 0;
40 41
41char *cgit_querystring = NULL; 42char *cgit_querystring = NULL;
42char *cgit_query_repo = NULL; 43char *cgit_query_repo = NULL;
43char *cgit_query_page = NULL; 44char *cgit_query_page = NULL;
44char *cgit_query_head = NULL; 45char *cgit_query_head = NULL;
45char *cgit_query_search = NULL; 46char *cgit_query_search = NULL;
46char *cgit_query_sha1 = NULL; 47char *cgit_query_sha1 = NULL;
47char *cgit_query_sha2 = NULL; 48char *cgit_query_sha2 = NULL;
48char *cgit_query_path = NULL; 49char *cgit_query_path = NULL;
49char *cgit_query_name = NULL; 50char *cgit_query_name = NULL;
50int cgit_query_ofs = 0; 51int cgit_query_ofs = 0;
51 52
52int htmlfd = 0; 53int htmlfd = 0;
53 54
54int chk_zero(int result, char *msg) 55int chk_zero(int result, char *msg)
55{ 56{
56 if (result != 0) 57 if (result != 0)
57 die("%s: %s", msg, strerror(errno)); 58 die("%s: %s", msg, strerror(errno));
58 return result; 59 return result;
59} 60}
60 61
61int chk_positive(int result, char *msg) 62int chk_positive(int result, char *msg)
62{ 63{
63 if (result <= 0) 64 if (result <= 0)
64 die("%s: %s", msg, strerror(errno)); 65 die("%s: %s", msg, strerror(errno));
65 return result; 66 return result;
66} 67}
67 68
68struct repoinfo *add_repo(const char *url) 69struct repoinfo *add_repo(const char *url)
69{ 70{
70 struct repoinfo *ret; 71 struct repoinfo *ret;
71 72
72 if (++cgit_repolist.count > cgit_repolist.length) { 73 if (++cgit_repolist.count > cgit_repolist.length) {
73 if (cgit_repolist.length == 0) 74 if (cgit_repolist.length == 0)
74 cgit_repolist.length = 8; 75 cgit_repolist.length = 8;
75 else 76 else
76 cgit_repolist.length *= 2; 77 cgit_repolist.length *= 2;
77 cgit_repolist.repos = xrealloc(cgit_repolist.repos, 78 cgit_repolist.repos = xrealloc(cgit_repolist.repos,
78 cgit_repolist.length * 79 cgit_repolist.length *
79 sizeof(struct repoinfo)); 80 sizeof(struct repoinfo));
80 } 81 }
81 82
82 ret = &cgit_repolist.repos[cgit_repolist.count-1]; 83 ret = &cgit_repolist.repos[cgit_repolist.count-1];
83 ret->url = xstrdup(url); 84 ret->url = xstrdup(url);
84 ret->name = ret->url; 85 ret->name = ret->url;
85 ret->path = NULL; 86 ret->path = NULL;
86 ret->desc = NULL; 87 ret->desc = NULL;
87 ret->owner = NULL; 88 ret->owner = NULL;
88 ret->snapshots = cgit_snapshots; 89 ret->snapshots = cgit_snapshots;
89 ret->module_link = cgit_module_link; 90 ret->module_link = cgit_module_link;
90 return ret; 91 return ret;
91} 92}
92 93
93void cgit_global_config_cb(const char *name, const char *value) 94void cgit_global_config_cb(const char *name, const char *value)
94{ 95{
95 if (!strcmp(name, "root-title")) 96 if (!strcmp(name, "root-title"))
96 cgit_root_title = xstrdup(value); 97 cgit_root_title = xstrdup(value);
97 else if (!strcmp(name, "css")) 98 else if (!strcmp(name, "css"))
98 cgit_css = xstrdup(value); 99 cgit_css = xstrdup(value);
99 else if (!strcmp(name, "logo")) 100 else if (!strcmp(name, "logo"))
100 cgit_logo = xstrdup(value); 101 cgit_logo = xstrdup(value);
101 else if (!strcmp(name, "logo-link")) 102 else if (!strcmp(name, "logo-link"))
102 cgit_logo_link = xstrdup(value); 103 cgit_logo_link = xstrdup(value);
103 else if (!strcmp(name, "module-link")) 104 else if (!strcmp(name, "module-link"))
104 cgit_module_link = xstrdup(value); 105 cgit_module_link = xstrdup(value);
105 else if (!strcmp(name, "virtual-root")) 106 else if (!strcmp(name, "virtual-root"))
106 cgit_virtual_root = xstrdup(value); 107 cgit_virtual_root = xstrdup(value);
107 else if (!strcmp(name, "nocache")) 108 else if (!strcmp(name, "nocache"))
108 cgit_nocache = atoi(value); 109 cgit_nocache = atoi(value);
109 else if (!strcmp(name, "snapshots")) 110 else if (!strcmp(name, "snapshots"))
110 cgit_snapshots = atoi(value); 111 cgit_snapshots = atoi(value);
111 else if (!strcmp(name, "cache-root")) 112 else if (!strcmp(name, "cache-root"))
112 cgit_cache_root = xstrdup(value); 113 cgit_cache_root = xstrdup(value);
113 else if (!strcmp(name, "cache-root-ttl")) 114 else if (!strcmp(name, "cache-root-ttl"))
114 cgit_cache_root_ttl = atoi(value); 115 cgit_cache_root_ttl = atoi(value);
115 else if (!strcmp(name, "cache-repo-ttl")) 116 else if (!strcmp(name, "cache-repo-ttl"))
116 cgit_cache_repo_ttl = atoi(value); 117 cgit_cache_repo_ttl = atoi(value);
117 else if (!strcmp(name, "cache-static-ttl")) 118 else if (!strcmp(name, "cache-static-ttl"))
118 cgit_cache_static_ttl = atoi(value); 119 cgit_cache_static_ttl = atoi(value);
119 else if (!strcmp(name, "cache-dynamic-ttl")) 120 else if (!strcmp(name, "cache-dynamic-ttl"))
120 cgit_cache_dynamic_ttl = atoi(value); 121 cgit_cache_dynamic_ttl = atoi(value);
121 else if (!strcmp(name, "max-message-length")) 122 else if (!strcmp(name, "max-message-length"))
122 cgit_max_msg_len = atoi(value); 123 cgit_max_msg_len = atoi(value);
124 else if (!strcmp(name, "max-commit-count"))
125 cgit_max_commit_count = atoi(value);
123 else if (!strcmp(name, "repo.url")) 126 else if (!strcmp(name, "repo.url"))
124 cgit_repo = add_repo(value); 127 cgit_repo = add_repo(value);
125 else if (!strcmp(name, "repo.name")) 128 else if (!strcmp(name, "repo.name"))
126 cgit_repo->name = xstrdup(value); 129 cgit_repo->name = xstrdup(value);
127 else if (cgit_repo && !strcmp(name, "repo.path")) 130 else if (cgit_repo && !strcmp(name, "repo.path"))
128 cgit_repo->path = xstrdup(value); 131 cgit_repo->path = xstrdup(value);
129 else if (cgit_repo && !strcmp(name, "repo.desc")) 132 else if (cgit_repo && !strcmp(name, "repo.desc"))
130 cgit_repo->desc = xstrdup(value); 133 cgit_repo->desc = xstrdup(value);
131 else if (cgit_repo && !strcmp(name, "repo.owner")) 134 else if (cgit_repo && !strcmp(name, "repo.owner"))
132 cgit_repo->owner = xstrdup(value); 135 cgit_repo->owner = xstrdup(value);
133 else if (cgit_repo && !strcmp(name, "repo.snapshots")) 136 else if (cgit_repo && !strcmp(name, "repo.snapshots"))
134 cgit_repo->snapshots = atoi(value); 137 cgit_repo->snapshots = atoi(value);
135 else if (cgit_repo && !strcmp(name, "repo.module-link")) 138 else if (cgit_repo && !strcmp(name, "repo.module-link"))
136 cgit_repo->module_link= xstrdup(value); 139 cgit_repo->module_link= xstrdup(value);
137} 140}
138 141
139void cgit_repo_config_cb(const char *name, const char *value) 142void cgit_repo_config_cb(const char *name, const char *value)
140{ 143{
141 if (!strcmp(name, "name")) 144 if (!strcmp(name, "name"))
142 cgit_repo_name = xstrdup(value); 145 cgit_repo_name = xstrdup(value);
143 else if (!strcmp(name, "desc")) 146 else if (!strcmp(name, "desc"))
144 cgit_repo_desc = xstrdup(value); 147 cgit_repo_desc = xstrdup(value);
145 else if (!strcmp(name, "owner")) 148 else if (!strcmp(name, "owner"))
146 cgit_repo_owner = xstrdup(value); 149 cgit_repo_owner = xstrdup(value);
147} 150}
148 151
149void cgit_querystring_cb(const char *name, const char *value) 152void cgit_querystring_cb(const char *name, const char *value)
150{ 153{
151 if (!strcmp(name,"r")) { 154 if (!strcmp(name,"r")) {
152 cgit_query_repo = xstrdup(value); 155 cgit_query_repo = xstrdup(value);
153 } else if (!strcmp(name, "p")) { 156 } else if (!strcmp(name, "p")) {
154 cgit_query_page = xstrdup(value); 157 cgit_query_page = xstrdup(value);
155 } else if (!strcmp(name, "q")) { 158 } else if (!strcmp(name, "q")) {
156 cgit_query_search = xstrdup(value); 159 cgit_query_search = xstrdup(value);
157 } else if (!strcmp(name, "h")) { 160 } else if (!strcmp(name, "h")) {
158 cgit_query_head = xstrdup(value); 161 cgit_query_head = xstrdup(value);
159 cgit_query_has_symref = 1; 162 cgit_query_has_symref = 1;
160 } else if (!strcmp(name, "id")) { 163 } else if (!strcmp(name, "id")) {
161 cgit_query_sha1 = xstrdup(value); 164 cgit_query_sha1 = xstrdup(value);
162 cgit_query_has_sha1 = 1; 165 cgit_query_has_sha1 = 1;
163 } else if (!strcmp(name, "id2")) { 166 } else if (!strcmp(name, "id2")) {
164 cgit_query_sha2 = xstrdup(value); 167 cgit_query_sha2 = xstrdup(value);
165 cgit_query_has_sha1 = 1; 168 cgit_query_has_sha1 = 1;
166 } else if (!strcmp(name, "ofs")) { 169 } else if (!strcmp(name, "ofs")) {
167 cgit_query_ofs = atoi(value); 170 cgit_query_ofs = atoi(value);
168 } else if (!strcmp(name, "path")) { 171 } else if (!strcmp(name, "path")) {
169 cgit_query_path = xstrdup(value); 172 cgit_query_path = xstrdup(value);
170 } else if (!strcmp(name, "name")) { 173 } else if (!strcmp(name, "name")) {
171 cgit_query_name = xstrdup(value); 174 cgit_query_name = xstrdup(value);
172 } 175 }
173} 176}
174 177
175void *cgit_free_commitinfo(struct commitinfo *info) 178void *cgit_free_commitinfo(struct commitinfo *info)
176{ 179{
177 free(info->author); 180 free(info->author);
178 free(info->author_email); 181 free(info->author_email);
179 free(info->committer); 182 free(info->committer);
180 free(info->committer_email); 183 free(info->committer_email);
181 free(info->subject); 184 free(info->subject);
182 free(info); 185 free(info);
183 return NULL; 186 return NULL;
184} 187}
185 188
186int hextoint(char c) 189int hextoint(char c)
187{ 190{
188 if (c >= 'a' && c <= 'f') 191 if (c >= 'a' && c <= 'f')
189 return 10 + c - 'a'; 192 return 10 + c - 'a';
190 else if (c >= 'A' && c <= 'F') 193 else if (c >= 'A' && c <= 'F')
191 return 10 + c - 'A'; 194 return 10 + c - 'A';
192 else if (c >= '0' && c <= '9') 195 else if (c >= '0' && c <= '9')
193 return c - '0'; 196 return c - '0';
194 else 197 else
195 return -1; 198 return -1;
196} 199}
197 200
198void cgit_diff_tree_cb(struct diff_queue_struct *q, 201void cgit_diff_tree_cb(struct diff_queue_struct *q,
199 struct diff_options *options, void *data) 202 struct diff_options *options, void *data)
200{ 203{
201 int i; 204 int i;
202 205
203 for (i = 0; i < q->nr; i++) { 206 for (i = 0; i < q->nr; i++) {
204 if (q->queue[i]->status == 'U') 207 if (q->queue[i]->status == 'U')
205 continue; 208 continue;
206 ((filepair_fn)data)(q->queue[i]); 209 ((filepair_fn)data)(q->queue[i]);
207 } 210 }
208} 211}
209 212
210static int load_mmfile(mmfile_t *file, const unsigned char *sha1) 213static int load_mmfile(mmfile_t *file, const unsigned char *sha1)
211{ 214{
212 enum object_type type; 215 enum object_type type;
213 216
214 if (is_null_sha1(sha1)) { 217 if (is_null_sha1(sha1)) {
215 file->ptr = (char *)""; 218 file->ptr = (char *)"";
216 file->size = 0; 219 file->size = 0;
217 } else { 220 } else {
218 file->ptr = read_sha1_file(sha1, &type, &file->size); 221 file->ptr = read_sha1_file(sha1, &type, &file->size);
219 } 222 }
220 return 1; 223 return 1;
221} 224}
222 225
223/* 226/*
224 * Receive diff-buffers from xdiff and concatenate them as 227 * Receive diff-buffers from xdiff and concatenate them as
225 * needed across multiple callbacks. 228 * needed across multiple callbacks.
226 * 229 *
227 * This is basically a copy of xdiff-interface.c/xdiff_outf(), 230 * This is basically a copy of xdiff-interface.c/xdiff_outf(),
228 * ripped from git and modified to use globals instead of 231 * ripped from git and modified to use globals instead of
229 * a special callback-struct. 232 * a special callback-struct.
230 */ 233 */
231char *diffbuf = NULL; 234char *diffbuf = NULL;
232int buflen = 0; 235int buflen = 0;
233 236
234int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) 237int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf)
235{ 238{
236 int i; 239 int i;
237 240
238 for (i = 0; i < nbuf; i++) { 241 for (i = 0; i < nbuf; i++) {
239 if (mb[i].ptr[mb[i].size-1] != '\n') { 242 if (mb[i].ptr[mb[i].size-1] != '\n') {
240 /* Incomplete line */ 243 /* Incomplete line */
241 diffbuf = xrealloc(diffbuf, buflen + mb[i].size); 244 diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
242 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); 245 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
243 buflen += mb[i].size; 246 buflen += mb[i].size;
244 continue; 247 continue;
245 } 248 }
246 249
247 /* we have a complete line */ 250 /* we have a complete line */
248 if (!diffbuf) { 251 if (!diffbuf) {
249 ((linediff_fn)priv)(mb[i].ptr, mb[i].size); 252 ((linediff_fn)priv)(mb[i].ptr, mb[i].size);
250 continue; 253 continue;
251 } 254 }
252 diffbuf = xrealloc(diffbuf, buflen + mb[i].size); 255 diffbuf = xrealloc(diffbuf, buflen + mb[i].size);
253 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); 256 memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size);
254 ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); 257 ((linediff_fn)priv)(diffbuf, buflen + mb[i].size);
255 free(diffbuf); 258 free(diffbuf);
256 diffbuf = NULL; 259 diffbuf = NULL;
257 buflen = 0; 260 buflen = 0;
258 } 261 }
259 if (diffbuf) { 262 if (diffbuf) {
260 ((linediff_fn)priv)(diffbuf, buflen); 263 ((linediff_fn)priv)(diffbuf, buflen);
261 free(diffbuf); 264 free(diffbuf);
262 diffbuf = NULL; 265 diffbuf = NULL;
263 buflen = 0; 266 buflen = 0;
264 } 267 }
265 return 0; 268 return 0;
266} 269}
267 270
268int cgit_diff_files(const unsigned char *old_sha1, 271int cgit_diff_files(const unsigned char *old_sha1,
269 const unsigned char *new_sha1, 272 const unsigned char *new_sha1,
270 linediff_fn fn) 273 linediff_fn fn)
271{ 274{
272 mmfile_t file1, file2; 275 mmfile_t file1, file2;
273 xpparam_t diff_params; 276 xpparam_t diff_params;
274 xdemitconf_t emit_params; 277 xdemitconf_t emit_params;
275 xdemitcb_t emit_cb; 278 xdemitcb_t emit_cb;
276 279
277 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) 280 if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1))
278 return 1; 281 return 1;
279 282
280 diff_params.flags = XDF_NEED_MINIMAL; 283 diff_params.flags = XDF_NEED_MINIMAL;
281 emit_params.ctxlen = 3; 284 emit_params.ctxlen = 3;
282 emit_params.flags = XDL_EMIT_FUNCNAMES; 285 emit_params.flags = XDL_EMIT_FUNCNAMES;
283 emit_cb.outf = filediff_cb; 286 emit_cb.outf = filediff_cb;
284 emit_cb.priv = fn; 287 emit_cb.priv = fn;
285 xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); 288 xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb);
286 return 0; 289 return 0;
287} 290}
288 291
289void cgit_diff_tree(const unsigned char *old_sha1, 292void cgit_diff_tree(const unsigned char *old_sha1,
290 const unsigned char *new_sha1, 293 const unsigned char *new_sha1,
291 filepair_fn fn) 294 filepair_fn fn)
292{ 295{
293 struct diff_options opt; 296 struct diff_options opt;
294 int ret; 297 int ret;
295 298
296 diff_setup(&opt); 299 diff_setup(&opt);
297 opt.output_format = DIFF_FORMAT_CALLBACK; 300 opt.output_format = DIFF_FORMAT_CALLBACK;
298 opt.detect_rename = 1; 301 opt.detect_rename = 1;
299 opt.recursive = 1; 302 opt.recursive = 1;
300 opt.format_callback = cgit_diff_tree_cb; 303 opt.format_callback = cgit_diff_tree_cb;
301 opt.format_callback_data = fn; 304 opt.format_callback_data = fn;
302 diff_setup_done(&opt); 305 diff_setup_done(&opt);
303 306
304 if (old_sha1) 307 if (old_sha1)
305 ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); 308 ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt);
306 else 309 else
307 ret = diff_root_tree_sha1(new_sha1, "", &opt); 310 ret = diff_root_tree_sha1(new_sha1, "", &opt);
308 diffcore_std(&opt); 311 diffcore_std(&opt);
309 diff_flush(&opt); 312 diff_flush(&opt);
310} 313}
311 314
312void cgit_diff_commit(struct commit *commit, filepair_fn fn) 315void cgit_diff_commit(struct commit *commit, filepair_fn fn)
313{ 316{
314 unsigned char *old_sha1 = NULL; 317 unsigned char *old_sha1 = NULL;