summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2008-07-27 10:58:37 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2008-07-27 10:58:37 (UTC)
commit952f4ece296d91b8b41f56de9e1c3bc80f94f196 (patch) (unidiff)
tree3ad6b53b89c0508b70c6dbf9bb73a02252b8ff98
parent25c84326deff579d5de4b880f9dca2690bdc8569 (diff)
downloadcgit-952f4ece296d91b8b41f56de9e1c3bc80f94f196.zip
cgit-952f4ece296d91b8b41f56de9e1c3bc80f94f196.tar.gz
cgit-952f4ece296d91b8b41f56de9e1c3bc80f94f196.tar.bz2
Modify default value for a few cgitrc options
The default max-length used when printing commit messages and repo descriptions can be increased due to the new layout (no sidebar). Also, on the repo summary page I believe it makes sense to only show the ten most recent branches and tags by default, just as it makes sense to show the ten most recent commit messages for the active branch. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/cgit.c b/cgit.c
index cefeddf..e2d5edb 100644
--- a/cgit.c
+++ b/cgit.c
@@ -1,396 +1,399 @@
1/* cgit.c: cgi for the git scm 1/* cgit.c: cgi for the git scm
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#include "cache.h" 10#include "cache.h"
11#include "cmd.h" 11#include "cmd.h"
12#include "configfile.h" 12#include "configfile.h"
13#include "html.h" 13#include "html.h"
14#include "ui-shared.h" 14#include "ui-shared.h"
15 15
16const char *cgit_version = CGIT_VERSION; 16const char *cgit_version = CGIT_VERSION;
17 17
18void config_cb(const char *name, const char *value) 18void config_cb(const char *name, const char *value)
19{ 19{
20 if (!strcmp(name, "root-title")) 20 if (!strcmp(name, "root-title"))
21 ctx.cfg.root_title = xstrdup(value); 21 ctx.cfg.root_title = xstrdup(value);
22 else if (!strcmp(name, "root-desc")) 22 else if (!strcmp(name, "root-desc"))
23 ctx.cfg.root_desc = xstrdup(value); 23 ctx.cfg.root_desc = xstrdup(value);
24 else if (!strcmp(name, "root-readme")) 24 else if (!strcmp(name, "root-readme"))
25 ctx.cfg.root_readme = xstrdup(value); 25 ctx.cfg.root_readme = xstrdup(value);
26 else if (!strcmp(name, "css")) 26 else if (!strcmp(name, "css"))
27 ctx.cfg.css = xstrdup(value); 27 ctx.cfg.css = xstrdup(value);
28 else if (!strcmp(name, "favicon")) 28 else if (!strcmp(name, "favicon"))
29 ctx.cfg.favicon = xstrdup(value); 29 ctx.cfg.favicon = xstrdup(value);
30 else if (!strcmp(name, "footer")) 30 else if (!strcmp(name, "footer"))
31 ctx.cfg.footer = xstrdup(value); 31 ctx.cfg.footer = xstrdup(value);
32 else if (!strcmp(name, "logo")) 32 else if (!strcmp(name, "logo"))
33 ctx.cfg.logo = xstrdup(value); 33 ctx.cfg.logo = xstrdup(value);
34 else if (!strcmp(name, "index-header")) 34 else if (!strcmp(name, "index-header"))
35 ctx.cfg.index_header = xstrdup(value); 35 ctx.cfg.index_header = xstrdup(value);
36 else if (!strcmp(name, "index-info")) 36 else if (!strcmp(name, "index-info"))
37 ctx.cfg.index_info = xstrdup(value); 37 ctx.cfg.index_info = xstrdup(value);
38 else if (!strcmp(name, "logo-link")) 38 else if (!strcmp(name, "logo-link"))
39 ctx.cfg.logo_link = xstrdup(value); 39 ctx.cfg.logo_link = xstrdup(value);
40 else if (!strcmp(name, "module-link")) 40 else if (!strcmp(name, "module-link"))
41 ctx.cfg.module_link = xstrdup(value); 41 ctx.cfg.module_link = xstrdup(value);
42 else if (!strcmp(name, "virtual-root")) { 42 else if (!strcmp(name, "virtual-root")) {
43 ctx.cfg.virtual_root = trim_end(value, '/'); 43 ctx.cfg.virtual_root = trim_end(value, '/');
44 if (!ctx.cfg.virtual_root && (!strcmp(value, "/"))) 44 if (!ctx.cfg.virtual_root && (!strcmp(value, "/")))
45 ctx.cfg.virtual_root = ""; 45 ctx.cfg.virtual_root = "";
46 } else if (!strcmp(name, "nocache")) 46 } else if (!strcmp(name, "nocache"))
47 ctx.cfg.nocache = atoi(value); 47 ctx.cfg.nocache = atoi(value);
48 else if (!strcmp(name, "snapshots")) 48 else if (!strcmp(name, "snapshots"))
49 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); 49 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
50 else if (!strcmp(name, "enable-index-links")) 50 else if (!strcmp(name, "enable-index-links"))
51 ctx.cfg.enable_index_links = atoi(value); 51 ctx.cfg.enable_index_links = atoi(value);
52 else if (!strcmp(name, "enable-log-filecount")) 52 else if (!strcmp(name, "enable-log-filecount"))
53 ctx.cfg.enable_log_filecount = atoi(value); 53 ctx.cfg.enable_log_filecount = atoi(value);
54 else if (!strcmp(name, "enable-log-linecount")) 54 else if (!strcmp(name, "enable-log-linecount"))
55 ctx.cfg.enable_log_linecount = atoi(value); 55 ctx.cfg.enable_log_linecount = atoi(value);
56 else if (!strcmp(name, "cache-size")) 56 else if (!strcmp(name, "cache-size"))
57 ctx.cfg.cache_size = atoi(value); 57 ctx.cfg.cache_size = atoi(value);
58 else if (!strcmp(name, "cache-root")) 58 else if (!strcmp(name, "cache-root"))
59 ctx.cfg.cache_root = xstrdup(value); 59 ctx.cfg.cache_root = xstrdup(value);
60 else if (!strcmp(name, "cache-root-ttl")) 60 else if (!strcmp(name, "cache-root-ttl"))
61 ctx.cfg.cache_root_ttl = atoi(value); 61 ctx.cfg.cache_root_ttl = atoi(value);
62 else if (!strcmp(name, "cache-repo-ttl")) 62 else if (!strcmp(name, "cache-repo-ttl"))
63 ctx.cfg.cache_repo_ttl = atoi(value); 63 ctx.cfg.cache_repo_ttl = atoi(value);
64 else if (!strcmp(name, "cache-static-ttl")) 64 else if (!strcmp(name, "cache-static-ttl"))
65 ctx.cfg.cache_static_ttl = atoi(value); 65 ctx.cfg.cache_static_ttl = atoi(value);
66 else if (!strcmp(name, "cache-dynamic-ttl")) 66 else if (!strcmp(name, "cache-dynamic-ttl"))
67 ctx.cfg.cache_dynamic_ttl = atoi(value); 67 ctx.cfg.cache_dynamic_ttl = atoi(value);
68 else if (!strcmp(name, "max-message-length")) 68 else if (!strcmp(name, "max-message-length"))
69 ctx.cfg.max_msg_len = atoi(value); 69 ctx.cfg.max_msg_len = atoi(value);
70 else if (!strcmp(name, "max-repodesc-length")) 70 else if (!strcmp(name, "max-repodesc-length"))
71 ctx.cfg.max_repodesc_len = atoi(value); 71 ctx.cfg.max_repodesc_len = atoi(value);
72 else if (!strcmp(name, "max-repo-count")) 72 else if (!strcmp(name, "max-repo-count"))
73 ctx.cfg.max_repo_count = atoi(value); 73 ctx.cfg.max_repo_count = atoi(value);
74 else if (!strcmp(name, "max-commit-count")) 74 else if (!strcmp(name, "max-commit-count"))
75 ctx.cfg.max_commit_count = atoi(value); 75 ctx.cfg.max_commit_count = atoi(value);
76 else if (!strcmp(name, "summary-log")) 76 else if (!strcmp(name, "summary-log"))
77 ctx.cfg.summary_log = atoi(value); 77 ctx.cfg.summary_log = atoi(value);
78 else if (!strcmp(name, "summary-branches")) 78 else if (!strcmp(name, "summary-branches"))
79 ctx.cfg.summary_branches = atoi(value); 79 ctx.cfg.summary_branches = atoi(value);
80 else if (!strcmp(name, "summary-tags")) 80 else if (!strcmp(name, "summary-tags"))
81 ctx.cfg.summary_tags = atoi(value); 81 ctx.cfg.summary_tags = atoi(value);
82 else if (!strcmp(name, "agefile")) 82 else if (!strcmp(name, "agefile"))
83 ctx.cfg.agefile = xstrdup(value); 83 ctx.cfg.agefile = xstrdup(value);
84 else if (!strcmp(name, "renamelimit")) 84 else if (!strcmp(name, "renamelimit"))
85 ctx.cfg.renamelimit = atoi(value); 85 ctx.cfg.renamelimit = atoi(value);
86 else if (!strcmp(name, "robots")) 86 else if (!strcmp(name, "robots"))
87 ctx.cfg.robots = xstrdup(value); 87 ctx.cfg.robots = xstrdup(value);
88 else if (!strcmp(name, "clone-prefix")) 88 else if (!strcmp(name, "clone-prefix"))
89 ctx.cfg.clone_prefix = xstrdup(value); 89 ctx.cfg.clone_prefix = xstrdup(value);
90 else if (!strcmp(name, "repo.group")) 90 else if (!strcmp(name, "repo.group"))
91 ctx.cfg.repo_group = xstrdup(value); 91 ctx.cfg.repo_group = xstrdup(value);
92 else if (!strcmp(name, "repo.url")) 92 else if (!strcmp(name, "repo.url"))
93 ctx.repo = cgit_add_repo(value); 93 ctx.repo = cgit_add_repo(value);
94 else if (!strcmp(name, "repo.name")) 94 else if (!strcmp(name, "repo.name"))
95 ctx.repo->name = xstrdup(value); 95 ctx.repo->name = xstrdup(value);
96 else if (ctx.repo && !strcmp(name, "repo.path")) 96 else if (ctx.repo && !strcmp(name, "repo.path"))
97 ctx.repo->path = trim_end(value, '/'); 97 ctx.repo->path = trim_end(value, '/');
98 else if (ctx.repo && !strcmp(name, "repo.clone-url")) 98 else if (ctx.repo && !strcmp(name, "repo.clone-url"))
99 ctx.repo->clone_url = xstrdup(value); 99 ctx.repo->clone_url = xstrdup(value);
100 else if (ctx.repo && !strcmp(name, "repo.desc")) 100 else if (ctx.repo && !strcmp(name, "repo.desc"))
101 ctx.repo->desc = xstrdup(value); 101 ctx.repo->desc = xstrdup(value);
102 else if (ctx.repo && !strcmp(name, "repo.owner")) 102 else if (ctx.repo && !strcmp(name, "repo.owner"))
103 ctx.repo->owner = xstrdup(value); 103 ctx.repo->owner = xstrdup(value);
104 else if (ctx.repo && !strcmp(name, "repo.defbranch")) 104 else if (ctx.repo && !strcmp(name, "repo.defbranch"))
105 ctx.repo->defbranch = xstrdup(value); 105 ctx.repo->defbranch = xstrdup(value);
106 else if (ctx.repo && !strcmp(name, "repo.snapshots")) 106 else if (ctx.repo && !strcmp(name, "repo.snapshots"))
107 ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */ 107 ctx.repo->snapshots = ctx.cfg.snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
108 else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount")) 108 else if (ctx.repo && !strcmp(name, "repo.enable-log-filecount"))
109 ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value); 109 ctx.repo->enable_log_filecount = ctx.cfg.enable_log_filecount * atoi(value);
110 else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount")) 110 else if (ctx.repo && !strcmp(name, "repo.enable-log-linecount"))
111 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value); 111 ctx.repo->enable_log_linecount = ctx.cfg.enable_log_linecount * atoi(value);
112 else if (ctx.repo && !strcmp(name, "repo.module-link")) 112 else if (ctx.repo && !strcmp(name, "repo.module-link"))
113 ctx.repo->module_link= xstrdup(value); 113 ctx.repo->module_link= xstrdup(value);
114 else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) { 114 else if (ctx.repo && !strcmp(name, "repo.readme") && value != NULL) {
115 if (*value == '/') 115 if (*value == '/')
116 ctx.repo->readme = xstrdup(value); 116 ctx.repo->readme = xstrdup(value);
117 else 117 else
118 ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value)); 118 ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value));
119 } else if (!strcmp(name, "include")) 119 } else if (!strcmp(name, "include"))
120 parse_configfile(value, config_cb); 120 parse_configfile(value, config_cb);
121} 121}
122 122
123static void querystring_cb(const char *name, const char *value) 123static void querystring_cb(const char *name, const char *value)
124{ 124{
125 if (!strcmp(name,"r")) { 125 if (!strcmp(name,"r")) {
126 ctx.qry.repo = xstrdup(value); 126 ctx.qry.repo = xstrdup(value);
127 ctx.repo = cgit_get_repoinfo(value); 127 ctx.repo = cgit_get_repoinfo(value);
128 } else if (!strcmp(name, "p")) { 128 } else if (!strcmp(name, "p")) {
129 ctx.qry.page = xstrdup(value); 129 ctx.qry.page = xstrdup(value);
130 } else if (!strcmp(name, "url")) { 130 } else if (!strcmp(name, "url")) {
131 cgit_parse_url(value); 131 cgit_parse_url(value);
132 } else if (!strcmp(name, "qt")) { 132 } else if (!strcmp(name, "qt")) {
133 ctx.qry.grep = xstrdup(value); 133 ctx.qry.grep = xstrdup(value);
134 } else if (!strcmp(name, "q")) { 134 } else if (!strcmp(name, "q")) {
135 ctx.qry.search = xstrdup(value); 135 ctx.qry.search = xstrdup(value);
136 } else if (!strcmp(name, "h")) { 136 } else if (!strcmp(name, "h")) {
137 ctx.qry.head = xstrdup(value); 137 ctx.qry.head = xstrdup(value);
138 ctx.qry.has_symref = 1; 138 ctx.qry.has_symref = 1;
139 } else if (!strcmp(name, "id")) { 139 } else if (!strcmp(name, "id")) {
140 ctx.qry.sha1 = xstrdup(value); 140 ctx.qry.sha1 = xstrdup(value);
141 ctx.qry.has_sha1 = 1; 141 ctx.qry.has_sha1 = 1;
142 } else if (!strcmp(name, "id2")) { 142 } else if (!strcmp(name, "id2")) {
143 ctx.qry.sha2 = xstrdup(value); 143 ctx.qry.sha2 = xstrdup(value);
144 ctx.qry.has_sha1 = 1; 144 ctx.qry.has_sha1 = 1;
145 } else if (!strcmp(name, "ofs")) { 145 } else if (!strcmp(name, "ofs")) {
146 ctx.qry.ofs = atoi(value); 146 ctx.qry.ofs = atoi(value);
147 } else if (!strcmp(name, "path")) { 147 } else if (!strcmp(name, "path")) {
148 ctx.qry.path = trim_end(value, '/'); 148 ctx.qry.path = trim_end(value, '/');
149 } else if (!strcmp(name, "name")) { 149 } else if (!strcmp(name, "name")) {
150 ctx.qry.name = xstrdup(value); 150 ctx.qry.name = xstrdup(value);
151 } else if (!strcmp(name, "mimetype")) { 151 } else if (!strcmp(name, "mimetype")) {
152 ctx.qry.mimetype = xstrdup(value); 152 ctx.qry.mimetype = xstrdup(value);
153 } 153 }
154} 154}
155 155
156static void prepare_context(struct cgit_context *ctx) 156static void prepare_context(struct cgit_context *ctx)
157{ 157{
158 memset(ctx, 0, sizeof(ctx)); 158 memset(ctx, 0, sizeof(ctx));
159 ctx->cfg.agefile = "info/web/last-modified"; 159 ctx->cfg.agefile = "info/web/last-modified";
160 ctx->cfg.nocache = 0; 160 ctx->cfg.nocache = 0;
161 ctx->cfg.cache_size = 0; 161 ctx->cfg.cache_size = 0;
162 ctx->cfg.cache_dynamic_ttl = 5; 162 ctx->cfg.cache_dynamic_ttl = 5;
163 ctx->cfg.cache_max_create_time = 5; 163 ctx->cfg.cache_max_create_time = 5;
164 ctx->cfg.cache_repo_ttl = 5; 164 ctx->cfg.cache_repo_ttl = 5;
165 ctx->cfg.cache_root = CGIT_CACHE_ROOT; 165 ctx->cfg.cache_root = CGIT_CACHE_ROOT;
166 ctx->cfg.cache_root_ttl = 5; 166 ctx->cfg.cache_root_ttl = 5;
167 ctx->cfg.cache_static_ttl = -1; 167 ctx->cfg.cache_static_ttl = -1;
168 ctx->cfg.css = "/cgit.css"; 168 ctx->cfg.css = "/cgit.css";
169 ctx->cfg.logo = "/git-logo.png"; 169 ctx->cfg.logo = "/git-logo.png";
170 ctx->cfg.max_repo_count = 50; 170 ctx->cfg.max_repo_count = 50;
171 ctx->cfg.max_commit_count = 50; 171 ctx->cfg.max_commit_count = 50;
172 ctx->cfg.max_lock_attempts = 5; 172 ctx->cfg.max_lock_attempts = 5;
173 ctx->cfg.max_msg_len = 60; 173 ctx->cfg.max_msg_len = 80;
174 ctx->cfg.max_repodesc_len = 60; 174 ctx->cfg.max_repodesc_len = 80;
175 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 175 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
176 ctx->cfg.renamelimit = -1; 176 ctx->cfg.renamelimit = -1;
177 ctx->cfg.robots = "index, nofollow"; 177 ctx->cfg.robots = "index, nofollow";
178 ctx->cfg.root_title = "Git repository browser"; 178 ctx->cfg.root_title = "Git repository browser";
179 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 179 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
180 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 180 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
181 ctx->cfg.summary_branches = 10;
182 ctx->cfg.summary_log = 10;
183 ctx->cfg.summary_tags = 10;
181 ctx->page.mimetype = "text/html"; 184 ctx->page.mimetype = "text/html";
182 ctx->page.charset = PAGE_ENCODING; 185 ctx->page.charset = PAGE_ENCODING;
183 ctx->page.filename = NULL; 186 ctx->page.filename = NULL;
184 ctx->page.modified = time(NULL); 187 ctx->page.modified = time(NULL);
185 ctx->page.expires = ctx->page.modified; 188 ctx->page.expires = ctx->page.modified;
186} 189}
187 190
188struct refmatch { 191struct refmatch {
189 char *req_ref; 192 char *req_ref;
190 char *first_ref; 193 char *first_ref;
191 int match; 194 int match;
192}; 195};
193 196
194int find_current_ref(const char *refname, const unsigned char *sha1, 197int find_current_ref(const char *refname, const unsigned char *sha1,
195 int flags, void *cb_data) 198 int flags, void *cb_data)
196{ 199{
197 struct refmatch *info; 200 struct refmatch *info;
198 201
199 info = (struct refmatch *)cb_data; 202 info = (struct refmatch *)cb_data;
200 if (!strcmp(refname, info->req_ref)) 203 if (!strcmp(refname, info->req_ref))
201 info->match = 1; 204 info->match = 1;
202 if (!info->first_ref) 205 if (!info->first_ref)
203 info->first_ref = xstrdup(refname); 206 info->first_ref = xstrdup(refname);
204 return info->match; 207 return info->match;
205} 208}
206 209
207char *find_default_branch(struct cgit_repo *repo) 210char *find_default_branch(struct cgit_repo *repo)
208{ 211{
209 struct refmatch info; 212 struct refmatch info;
210 char *ref; 213 char *ref;
211 214
212 info.req_ref = repo->defbranch; 215 info.req_ref = repo->defbranch;
213 info.first_ref = NULL; 216 info.first_ref = NULL;
214 info.match = 0; 217 info.match = 0;
215 for_each_branch_ref(find_current_ref, &info); 218 for_each_branch_ref(find_current_ref, &info);
216 if (info.match) 219 if (info.match)
217 ref = info.req_ref; 220 ref = info.req_ref;
218 else 221 else
219 ref = info.first_ref; 222 ref = info.first_ref;
220 if (ref) 223 if (ref)
221 ref = xstrdup(ref); 224 ref = xstrdup(ref);
222 return ref; 225 return ref;
223} 226}
224 227
225static int prepare_repo_cmd(struct cgit_context *ctx) 228static int prepare_repo_cmd(struct cgit_context *ctx)
226{ 229{
227 char *tmp; 230 char *tmp;
228 unsigned char sha1[20]; 231 unsigned char sha1[20];
229 int nongit = 0; 232 int nongit = 0;
230 233
231 setenv("GIT_DIR", ctx->repo->path, 1); 234 setenv("GIT_DIR", ctx->repo->path, 1);
232 setup_git_directory_gently(&nongit); 235 setup_git_directory_gently(&nongit);
233 if (nongit) { 236 if (nongit) {
234 ctx->page.title = fmt("%s - %s", ctx->cfg.root_title, 237 ctx->page.title = fmt("%s - %s", ctx->cfg.root_title,
235 "config error"); 238 "config error");
236 tmp = fmt("Not a git repository: '%s'", ctx->repo->path); 239 tmp = fmt("Not a git repository: '%s'", ctx->repo->path);
237 ctx->repo = NULL; 240 ctx->repo = NULL;
238 cgit_print_http_headers(ctx); 241 cgit_print_http_headers(ctx);
239 cgit_print_docstart(ctx); 242 cgit_print_docstart(ctx);
240 cgit_print_pageheader(ctx); 243 cgit_print_pageheader(ctx);
241 cgit_print_error(tmp); 244 cgit_print_error(tmp);
242 cgit_print_docend(); 245 cgit_print_docend();
243 return 1; 246 return 1;
244 } 247 }
245 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); 248 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc);
246 249
247 if (!ctx->qry.head) { 250 if (!ctx->qry.head) {
248 ctx->qry.head = find_default_branch(ctx->repo); 251 ctx->qry.head = find_default_branch(ctx->repo);
249 ctx->repo->defbranch = ctx->qry.head; 252 ctx->repo->defbranch = ctx->qry.head;
250 } 253 }
251 254
252 if (!ctx->qry.head) { 255 if (!ctx->qry.head) {
253 cgit_print_http_headers(ctx); 256 cgit_print_http_headers(ctx);
254 cgit_print_docstart(ctx); 257 cgit_print_docstart(ctx);
255 cgit_print_pageheader(ctx); 258 cgit_print_pageheader(ctx);
256 cgit_print_error("Repository seems to be empty"); 259 cgit_print_error("Repository seems to be empty");
257 cgit_print_docend(); 260 cgit_print_docend();
258 return 1; 261 return 1;
259 } 262 }
260 263
261 if (get_sha1(ctx->qry.head, sha1)) { 264 if (get_sha1(ctx->qry.head, sha1)) {
262 tmp = xstrdup(ctx->qry.head); 265 tmp = xstrdup(ctx->qry.head);
263 ctx->qry.head = ctx->repo->defbranch; 266 ctx->qry.head = ctx->repo->defbranch;
264 cgit_print_http_headers(ctx); 267 cgit_print_http_headers(ctx);
265 cgit_print_docstart(ctx); 268 cgit_print_docstart(ctx);
266 cgit_print_pageheader(ctx); 269 cgit_print_pageheader(ctx);
267 cgit_print_error(fmt("Invalid branch: %s", tmp)); 270 cgit_print_error(fmt("Invalid branch: %s", tmp));
268 cgit_print_docend(); 271 cgit_print_docend();
269 return 1; 272 return 1;
270 } 273 }
271 return 0; 274 return 0;
272} 275}
273 276
274static void process_request(void *cbdata) 277static void process_request(void *cbdata)
275{ 278{
276 struct cgit_context *ctx = cbdata; 279 struct cgit_context *ctx = cbdata;
277 struct cgit_cmd *cmd; 280 struct cgit_cmd *cmd;
278 281
279 cmd = cgit_get_cmd(ctx); 282 cmd = cgit_get_cmd(ctx);
280 if (!cmd) { 283 if (!cmd) {
281 ctx->page.title = "cgit error"; 284 ctx->page.title = "cgit error";
282 ctx->repo = NULL; 285 ctx->repo = NULL;
283 cgit_print_http_headers(ctx); 286 cgit_print_http_headers(ctx);
284 cgit_print_docstart(ctx); 287 cgit_print_docstart(ctx);
285 cgit_print_pageheader(ctx); 288 cgit_print_pageheader(ctx);
286 cgit_print_error("Invalid request"); 289 cgit_print_error("Invalid request");
287 cgit_print_docend(); 290 cgit_print_docend();
288 return; 291 return;
289 } 292 }
290 293
291 if (cmd->want_repo && !ctx->repo) { 294 if (cmd->want_repo && !ctx->repo) {
292 cgit_print_http_headers(ctx); 295 cgit_print_http_headers(ctx);
293 cgit_print_docstart(ctx); 296 cgit_print_docstart(ctx);
294 cgit_print_pageheader(ctx); 297 cgit_print_pageheader(ctx);
295 cgit_print_error(fmt("No repository selected")); 298 cgit_print_error(fmt("No repository selected"));
296 cgit_print_docend(); 299 cgit_print_docend();
297 return; 300 return;
298 } 301 }
299 302
300 if (ctx->repo && prepare_repo_cmd(ctx)) 303 if (ctx->repo && prepare_repo_cmd(ctx))
301 return; 304 return;
302 305
303 if (cmd->want_layout) { 306 if (cmd->want_layout) {
304 cgit_print_http_headers(ctx); 307 cgit_print_http_headers(ctx);
305 cgit_print_docstart(ctx); 308 cgit_print_docstart(ctx);
306 cgit_print_pageheader(ctx); 309 cgit_print_pageheader(ctx);
307 } 310 }
308 311
309 cmd->fn(ctx); 312 cmd->fn(ctx);
310 313
311 if (cmd->want_layout) 314 if (cmd->want_layout)
312 cgit_print_docend(); 315 cgit_print_docend();
313} 316}
314 317
315static void cgit_parse_args(int argc, const char **argv) 318static void cgit_parse_args(int argc, const char **argv)
316{ 319{
317 int i; 320 int i;
318 321
319 for (i = 1; i < argc; i++) { 322 for (i = 1; i < argc; i++) {
320 if (!strncmp(argv[i], "--cache=", 8)) { 323 if (!strncmp(argv[i], "--cache=", 8)) {
321 ctx.cfg.cache_root = xstrdup(argv[i]+8); 324 ctx.cfg.cache_root = xstrdup(argv[i]+8);
322 } 325 }
323 if (!strcmp(argv[i], "--nocache")) { 326 if (!strcmp(argv[i], "--nocache")) {
324 ctx.cfg.nocache = 1; 327 ctx.cfg.nocache = 1;
325 } 328 }
326 if (!strncmp(argv[i], "--query=", 8)) { 329 if (!strncmp(argv[i], "--query=", 8)) {
327 ctx.qry.raw = xstrdup(argv[i]+8); 330 ctx.qry.raw = xstrdup(argv[i]+8);
328 } 331 }
329 if (!strncmp(argv[i], "--repo=", 7)) { 332 if (!strncmp(argv[i], "--repo=", 7)) {
330 ctx.qry.repo = xstrdup(argv[i]+7); 333 ctx.qry.repo = xstrdup(argv[i]+7);
331 } 334 }
332 if (!strncmp(argv[i], "--page=", 7)) { 335 if (!strncmp(argv[i], "--page=", 7)) {
333 ctx.qry.page = xstrdup(argv[i]+7); 336 ctx.qry.page = xstrdup(argv[i]+7);
334 } 337 }
335 if (!strncmp(argv[i], "--head=", 7)) { 338 if (!strncmp(argv[i], "--head=", 7)) {
336 ctx.qry.head = xstrdup(argv[i]+7); 339 ctx.qry.head = xstrdup(argv[i]+7);
337 ctx.qry.has_symref = 1; 340 ctx.qry.has_symref = 1;
338 } 341 }
339 if (!strncmp(argv[i], "--sha1=", 7)) { 342 if (!strncmp(argv[i], "--sha1=", 7)) {
340 ctx.qry.sha1 = xstrdup(argv[i]+7); 343 ctx.qry.sha1 = xstrdup(argv[i]+7);
341 ctx.qry.has_sha1 = 1; 344 ctx.qry.has_sha1 = 1;
342 } 345 }
343 if (!strncmp(argv[i], "--ofs=", 6)) { 346 if (!strncmp(argv[i], "--ofs=", 6)) {
344 ctx.qry.ofs = atoi(argv[i]+6); 347 ctx.qry.ofs = atoi(argv[i]+6);
345 } 348 }
346 } 349 }
347} 350}
348 351
349static int calc_ttl() 352static int calc_ttl()
350{ 353{
351 if (!ctx.repo) 354 if (!ctx.repo)
352 return ctx.cfg.cache_root_ttl; 355 return ctx.cfg.cache_root_ttl;
353 356
354 if (!ctx.qry.page) 357 if (!ctx.qry.page)
355 return ctx.cfg.cache_repo_ttl; 358 return ctx.cfg.cache_repo_ttl;
356 359
357 if (ctx.qry.has_symref) 360 if (ctx.qry.has_symref)
358 return ctx.cfg.cache_dynamic_ttl; 361 return ctx.cfg.cache_dynamic_ttl;
359 362
360 if (ctx.qry.has_sha1) 363 if (ctx.qry.has_sha1)
361 return ctx.cfg.cache_static_ttl; 364 return ctx.cfg.cache_static_ttl;
362 365
363 return ctx.cfg.cache_repo_ttl; 366 return ctx.cfg.cache_repo_ttl;
364} 367}
365 368
366int main(int argc, const char **argv) 369int main(int argc, const char **argv)
367{ 370{
368 const char *cgit_config_env = getenv("CGIT_CONFIG"); 371 const char *cgit_config_env = getenv("CGIT_CONFIG");
369 int err, ttl; 372 int err, ttl;
370 373
371 prepare_context(&ctx); 374 prepare_context(&ctx);
372 cgit_repolist.length = 0; 375 cgit_repolist.length = 0;
373 cgit_repolist.count = 0; 376 cgit_repolist.count = 0;
374 cgit_repolist.repos = NULL; 377 cgit_repolist.repos = NULL;
375 378
376 parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG, 379 parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
377 config_cb); 380 config_cb);
378 ctx.repo = NULL; 381 ctx.repo = NULL;
379 if (getenv("SCRIPT_NAME")) 382 if (getenv("SCRIPT_NAME"))
380 ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); 383 ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME"));
381 if (getenv("QUERY_STRING")) 384 if (getenv("QUERY_STRING"))
382 ctx.qry.raw = xstrdup(getenv("QUERY_STRING")); 385 ctx.qry.raw = xstrdup(getenv("QUERY_STRING"));
383 cgit_parse_args(argc, argv); 386 cgit_parse_args(argc, argv);
384 http_parse_querystring(ctx.qry.raw, querystring_cb); 387 http_parse_querystring(ctx.qry.raw, querystring_cb);
385 388
386 ttl = calc_ttl(); 389 ttl = calc_ttl();
387 ctx.page.expires += ttl*60; 390 ctx.page.expires += ttl*60;
388 if (ctx.cfg.nocache) 391 if (ctx.cfg.nocache)
389 ctx.cfg.cache_size = 0; 392 ctx.cfg.cache_size = 0;
390 err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root, 393 err = cache_process(ctx.cfg.cache_size, ctx.cfg.cache_root,
391 ctx.qry.raw, ttl, process_request, &ctx); 394 ctx.qry.raw, ttl, process_request, &ctx);
392 if (err) 395 if (err)
393 cgit_print_error(fmt("Error processing page: %s (%d)", 396 cgit_print_error(fmt("Error processing page: %s (%d)",
394 strerror(err), err)); 397 strerror(err), err));
395 return err; 398 return err;
396} 399}