|
diff --git a/cgit.c b/cgit.c index d1cee58..f35f605 100644 --- a/ cgit.c+++ b/ cgit.c |
|
@@ -200,193 +200,192 @@ static void prepare_context(struct cgit_context *ctx) |
200 | |
200 | |
201 | struct refmatch { |
201 | struct refmatch { |
202 | char *req_ref; |
202 | char *req_ref; |
203 | char *first_ref; |
203 | char *first_ref; |
204 | int match; |
204 | int match; |
205 | }; |
205 | }; |
206 | |
206 | |
207 | int find_current_ref(const char *refname, const unsigned char *sha1, |
207 | int find_current_ref(const char *refname, const unsigned char *sha1, |
208 | int flags, void *cb_data) |
208 | int flags, void *cb_data) |
209 | { |
209 | { |
210 | struct refmatch *info; |
210 | struct refmatch *info; |
211 | |
211 | |
212 | info = (struct refmatch *)cb_data; |
212 | info = (struct refmatch *)cb_data; |
213 | if (!strcmp(refname, info->req_ref)) |
213 | if (!strcmp(refname, info->req_ref)) |
214 | info->match = 1; |
214 | info->match = 1; |
215 | if (!info->first_ref) |
215 | if (!info->first_ref) |
216 | info->first_ref = xstrdup(refname); |
216 | info->first_ref = xstrdup(refname); |
217 | return info->match; |
217 | return info->match; |
218 | } |
218 | } |
219 | |
219 | |
220 | char *find_default_branch(struct cgit_repo *repo) |
220 | char *find_default_branch(struct cgit_repo *repo) |
221 | { |
221 | { |
222 | struct refmatch info; |
222 | struct refmatch info; |
223 | char *ref; |
223 | char *ref; |
224 | |
224 | |
225 | info.req_ref = repo->defbranch; |
225 | info.req_ref = repo->defbranch; |
226 | info.first_ref = NULL; |
226 | info.first_ref = NULL; |
227 | info.match = 0; |
227 | info.match = 0; |
228 | for_each_branch_ref(find_current_ref, &info); |
228 | for_each_branch_ref(find_current_ref, &info); |
229 | if (info.match) |
229 | if (info.match) |
230 | ref = info.req_ref; |
230 | ref = info.req_ref; |
231 | else |
231 | else |
232 | ref = info.first_ref; |
232 | ref = info.first_ref; |
233 | if (ref) |
233 | if (ref) |
234 | ref = xstrdup(ref); |
234 | ref = xstrdup(ref); |
235 | return ref; |
235 | return ref; |
236 | } |
236 | } |
237 | |
237 | |
238 | static int prepare_repo_cmd(struct cgit_context *ctx) |
238 | static int prepare_repo_cmd(struct cgit_context *ctx) |
239 | { |
239 | { |
240 | char *tmp; |
240 | char *tmp; |
241 | unsigned char sha1[20]; |
241 | unsigned char sha1[20]; |
242 | int nongit = 0; |
242 | int nongit = 0; |
243 | |
243 | |
244 | setenv("GIT_DIR", ctx->repo->path, 1); |
244 | setenv("GIT_DIR", ctx->repo->path, 1); |
245 | setup_git_directory_gently(&nongit); |
245 | setup_git_directory_gently(&nongit); |
246 | if (nongit) { |
246 | if (nongit) { |
247 | ctx->page.title = fmt("%s - %s", ctx->cfg.root_title, |
247 | ctx->page.title = fmt("%s - %s", ctx->cfg.root_title, |
248 | "config error"); |
248 | "config error"); |
249 | tmp = fmt("Not a git repository: '%s'", ctx->repo->path); |
249 | tmp = fmt("Not a git repository: '%s'", ctx->repo->path); |
250 | ctx->repo = NULL; |
250 | ctx->repo = NULL; |
251 | cgit_print_http_headers(ctx); |
251 | cgit_print_http_headers(ctx); |
252 | cgit_print_docstart(ctx); |
252 | cgit_print_docstart(ctx); |
253 | cgit_print_pageheader(ctx); |
253 | cgit_print_pageheader(ctx); |
254 | cgit_print_error(tmp); |
254 | cgit_print_error(tmp); |
255 | cgit_print_docend(); |
255 | cgit_print_docend(); |
256 | return 1; |
256 | return 1; |
257 | } |
257 | } |
258 | ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); |
258 | ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); |
259 | |
259 | |
260 | if (!ctx->qry.head) { |
260 | if (!ctx->qry.head) { |
261 | ctx->qry.nohead = 1; |
261 | ctx->qry.nohead = 1; |
262 | ctx->qry.head = find_default_branch(ctx->repo); |
262 | ctx->qry.head = find_default_branch(ctx->repo); |
263 | ctx->repo->defbranch = ctx->qry.head; |
263 | ctx->repo->defbranch = ctx->qry.head; |
264 | } |
264 | } |
265 | |
265 | |
266 | if (!ctx->qry.head) { |
266 | if (!ctx->qry.head) { |
267 | cgit_print_http_headers(ctx); |
267 | cgit_print_http_headers(ctx); |
268 | cgit_print_docstart(ctx); |
268 | cgit_print_docstart(ctx); |
269 | cgit_print_pageheader(ctx); |
269 | cgit_print_pageheader(ctx); |
270 | cgit_print_error("Repository seems to be empty"); |
270 | cgit_print_error("Repository seems to be empty"); |
271 | cgit_print_docend(); |
271 | cgit_print_docend(); |
272 | return 1; |
272 | return 1; |
273 | } |
273 | } |
274 | |
274 | |
275 | if (get_sha1(ctx->qry.head, sha1)) { |
275 | if (get_sha1(ctx->qry.head, sha1)) { |
276 | tmp = xstrdup(ctx->qry.head); |
276 | tmp = xstrdup(ctx->qry.head); |
277 | ctx->qry.head = ctx->repo->defbranch; |
277 | ctx->qry.head = ctx->repo->defbranch; |
278 | cgit_print_http_headers(ctx); |
278 | cgit_print_http_headers(ctx); |
279 | cgit_print_docstart(ctx); |
279 | cgit_print_docstart(ctx); |
280 | cgit_print_pageheader(ctx); |
280 | cgit_print_pageheader(ctx); |
281 | cgit_print_error(fmt("Invalid branch: %s", tmp)); |
281 | cgit_print_error(fmt("Invalid branch: %s", tmp)); |
282 | cgit_print_docend(); |
282 | cgit_print_docend(); |
283 | return 1; |
283 | return 1; |
284 | } |
284 | } |
285 | return 0; |
285 | return 0; |
286 | } |
286 | } |
287 | |
287 | |
288 | static void process_request(void *cbdata) |
288 | static void process_request(void *cbdata) |
289 | { |
289 | { |
290 | struct cgit_context *ctx = cbdata; |
290 | struct cgit_context *ctx = cbdata; |
291 | struct cgit_cmd *cmd; |
291 | struct cgit_cmd *cmd; |
292 | |
292 | |
293 | cmd = cgit_get_cmd(ctx); |
293 | cmd = cgit_get_cmd(ctx); |
294 | if (!cmd) { |
294 | if (!cmd) { |
295 | ctx->page.title = "cgit error"; |
295 | ctx->page.title = "cgit error"; |
296 | ctx->repo = NULL; |
| |
297 | cgit_print_http_headers(ctx); |
296 | cgit_print_http_headers(ctx); |
298 | cgit_print_docstart(ctx); |
297 | cgit_print_docstart(ctx); |
299 | cgit_print_pageheader(ctx); |
298 | cgit_print_pageheader(ctx); |
300 | cgit_print_error("Invalid request"); |
299 | cgit_print_error("Invalid request"); |
301 | cgit_print_docend(); |
300 | cgit_print_docend(); |
302 | return; |
301 | return; |
303 | } |
302 | } |
304 | |
303 | |
305 | if (cmd->want_repo && !ctx->repo) { |
304 | if (cmd->want_repo && !ctx->repo) { |
306 | cgit_print_http_headers(ctx); |
305 | cgit_print_http_headers(ctx); |
307 | cgit_print_docstart(ctx); |
306 | cgit_print_docstart(ctx); |
308 | cgit_print_pageheader(ctx); |
307 | cgit_print_pageheader(ctx); |
309 | cgit_print_error(fmt("No repository selected")); |
308 | cgit_print_error(fmt("No repository selected")); |
310 | cgit_print_docend(); |
309 | cgit_print_docend(); |
311 | return; |
310 | return; |
312 | } |
311 | } |
313 | |
312 | |
314 | if (ctx->repo && prepare_repo_cmd(ctx)) |
313 | if (ctx->repo && prepare_repo_cmd(ctx)) |
315 | return; |
314 | return; |
316 | |
315 | |
317 | if (cmd->want_layout) { |
316 | if (cmd->want_layout) { |
318 | cgit_print_http_headers(ctx); |
317 | cgit_print_http_headers(ctx); |
319 | cgit_print_docstart(ctx); |
318 | cgit_print_docstart(ctx); |
320 | cgit_print_pageheader(ctx); |
319 | cgit_print_pageheader(ctx); |
321 | } |
320 | } |
322 | |
321 | |
323 | cmd->fn(ctx); |
322 | cmd->fn(ctx); |
324 | |
323 | |
325 | if (cmd->want_layout) |
324 | if (cmd->want_layout) |
326 | cgit_print_docend(); |
325 | cgit_print_docend(); |
327 | } |
326 | } |
328 | |
327 | |
329 | int cmp_repos(const void *a, const void *b) |
328 | int cmp_repos(const void *a, const void *b) |
330 | { |
329 | { |
331 | const struct cgit_repo *ra = a, *rb = b; |
330 | const struct cgit_repo *ra = a, *rb = b; |
332 | return strcmp(ra->url, rb->url); |
331 | return strcmp(ra->url, rb->url); |
333 | } |
332 | } |
334 | |
333 | |
335 | void print_repo(struct cgit_repo *repo) |
334 | void print_repo(struct cgit_repo *repo) |
336 | { |
335 | { |
337 | printf("repo.url=%s\n", repo->url); |
336 | printf("repo.url=%s\n", repo->url); |
338 | printf("repo.name=%s\n", repo->name); |
337 | printf("repo.name=%s\n", repo->name); |
339 | printf("repo.path=%s\n", repo->path); |
338 | printf("repo.path=%s\n", repo->path); |
340 | if (repo->owner) |
339 | if (repo->owner) |
341 | printf("repo.owner=%s\n", repo->owner); |
340 | printf("repo.owner=%s\n", repo->owner); |
342 | if (repo->desc) |
341 | if (repo->desc) |
343 | printf("repo.desc=%s\n", repo->desc); |
342 | printf("repo.desc=%s\n", repo->desc); |
344 | if (repo->readme) |
343 | if (repo->readme) |
345 | printf("repo.readme=%s\n", repo->readme); |
344 | printf("repo.readme=%s\n", repo->readme); |
346 | printf("\n"); |
345 | printf("\n"); |
347 | } |
346 | } |
348 | |
347 | |
349 | void print_repolist(struct cgit_repolist *list) |
348 | void print_repolist(struct cgit_repolist *list) |
350 | { |
349 | { |
351 | int i; |
350 | int i; |
352 | |
351 | |
353 | for(i = 0; i < list->count; i++) |
352 | for(i = 0; i < list->count; i++) |
354 | print_repo(&list->repos[i]); |
353 | print_repo(&list->repos[i]); |
355 | } |
354 | } |
356 | |
355 | |
357 | |
356 | |
358 | static void cgit_parse_args(int argc, const char **argv) |
357 | static void cgit_parse_args(int argc, const char **argv) |
359 | { |
358 | { |
360 | int i; |
359 | int i; |
361 | int scan = 0; |
360 | int scan = 0; |
362 | |
361 | |
363 | for (i = 1; i < argc; i++) { |
362 | for (i = 1; i < argc; i++) { |
364 | if (!strncmp(argv[i], "--cache=", 8)) { |
363 | if (!strncmp(argv[i], "--cache=", 8)) { |
365 | ctx.cfg.cache_root = xstrdup(argv[i]+8); |
364 | ctx.cfg.cache_root = xstrdup(argv[i]+8); |
366 | } |
365 | } |
367 | if (!strcmp(argv[i], "--nocache")) { |
366 | if (!strcmp(argv[i], "--nocache")) { |
368 | ctx.cfg.nocache = 1; |
367 | ctx.cfg.nocache = 1; |
369 | } |
368 | } |
370 | if (!strncmp(argv[i], "--query=", 8)) { |
369 | if (!strncmp(argv[i], "--query=", 8)) { |
371 | ctx.qry.raw = xstrdup(argv[i]+8); |
370 | ctx.qry.raw = xstrdup(argv[i]+8); |
372 | } |
371 | } |
373 | if (!strncmp(argv[i], "--repo=", 7)) { |
372 | if (!strncmp(argv[i], "--repo=", 7)) { |
374 | ctx.qry.repo = xstrdup(argv[i]+7); |
373 | ctx.qry.repo = xstrdup(argv[i]+7); |
375 | } |
374 | } |
376 | if (!strncmp(argv[i], "--page=", 7)) { |
375 | if (!strncmp(argv[i], "--page=", 7)) { |
377 | ctx.qry.page = xstrdup(argv[i]+7); |
376 | ctx.qry.page = xstrdup(argv[i]+7); |
378 | } |
377 | } |
379 | if (!strncmp(argv[i], "--head=", 7)) { |
378 | if (!strncmp(argv[i], "--head=", 7)) { |
380 | ctx.qry.head = xstrdup(argv[i]+7); |
379 | ctx.qry.head = xstrdup(argv[i]+7); |
381 | ctx.qry.has_symref = 1; |
380 | ctx.qry.has_symref = 1; |
382 | } |
381 | } |
383 | if (!strncmp(argv[i], "--sha1=", 7)) { |
382 | if (!strncmp(argv[i], "--sha1=", 7)) { |
384 | ctx.qry.sha1 = xstrdup(argv[i]+7); |
383 | ctx.qry.sha1 = xstrdup(argv[i]+7); |
385 | ctx.qry.has_sha1 = 1; |
384 | ctx.qry.has_sha1 = 1; |
386 | } |
385 | } |
387 | if (!strncmp(argv[i], "--ofs=", 6)) { |
386 | if (!strncmp(argv[i], "--ofs=", 6)) { |
388 | ctx.qry.ofs = atoi(argv[i]+6); |
387 | ctx.qry.ofs = atoi(argv[i]+6); |
389 | } |
388 | } |
390 | if (!strncmp(argv[i], "--scan-tree=", 12)) { |
389 | if (!strncmp(argv[i], "--scan-tree=", 12)) { |
391 | scan++; |
390 | scan++; |
392 | scan_tree(argv[i] + 12); |
391 | scan_tree(argv[i] + 12); |
|