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