summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index e498030..5259f56 100644
--- a/cgit.c
+++ b/cgit.c
@@ -358,103 +358,107 @@ static void prepare_context(struct cgit_context *ctx)
358 if (ctx->env.query_string) 358 if (ctx->env.query_string)
359 ctx->qry.raw = ctx->env.query_string; 359 ctx->qry.raw = ctx->env.query_string;
360 if (!ctx->env.cgit_config) 360 if (!ctx->env.cgit_config)
361 ctx->env.cgit_config = CGIT_CONFIG; 361 ctx->env.cgit_config = CGIT_CONFIG;
362} 362}
363 363
364struct refmatch { 364struct refmatch {
365 char *req_ref; 365 char *req_ref;
366 char *first_ref; 366 char *first_ref;
367 int match; 367 int match;
368}; 368};
369 369
370int find_current_ref(const char *refname, const unsigned char *sha1, 370int find_current_ref(const char *refname, const unsigned char *sha1,
371 int flags, void *cb_data) 371 int flags, void *cb_data)
372{ 372{
373 struct refmatch *info; 373 struct refmatch *info;
374 374
375 info = (struct refmatch *)cb_data; 375 info = (struct refmatch *)cb_data;
376 if (!strcmp(refname, info->req_ref)) 376 if (!strcmp(refname, info->req_ref))
377 info->match = 1; 377 info->match = 1;
378 if (!info->first_ref) 378 if (!info->first_ref)
379 info->first_ref = xstrdup(refname); 379 info->first_ref = xstrdup(refname);
380 return info->match; 380 return info->match;
381} 381}
382 382
383char *find_default_branch(struct cgit_repo *repo) 383char *find_default_branch(struct cgit_repo *repo)
384{ 384{
385 struct refmatch info; 385 struct refmatch info;
386 char *ref; 386 char *ref;
387 387
388 info.req_ref = repo->defbranch; 388 info.req_ref = repo->defbranch;
389 info.first_ref = NULL; 389 info.first_ref = NULL;
390 info.match = 0; 390 info.match = 0;
391 for_each_branch_ref(find_current_ref, &info); 391 for_each_branch_ref(find_current_ref, &info);
392 if (info.match) 392 if (info.match)
393 ref = info.req_ref; 393 ref = info.req_ref;
394 else 394 else
395 ref = info.first_ref; 395 ref = info.first_ref;
396 if (ref) 396 if (ref)
397 ref = xstrdup(ref); 397 ref = xstrdup(ref);
398 return ref; 398 return ref;
399} 399}
400 400
401static int prepare_repo_cmd(struct cgit_context *ctx) 401static int prepare_repo_cmd(struct cgit_context *ctx)
402{ 402{
403 char *tmp; 403 char *tmp;
404 unsigned char sha1[20]; 404 unsigned char sha1[20];
405 int nongit = 0; 405 int nongit = 0;
406 int rc;
406 407
407 setenv("GIT_DIR", ctx->repo->path, 1); 408 setenv("GIT_DIR", ctx->repo->path, 1);
408 setup_git_directory_gently(&nongit); 409 setup_git_directory_gently(&nongit);
409 if (nongit) { 410 if (nongit) {
411 rc = errno;
410 ctx->page.title = fmt("%s - %s", ctx->cfg.root_title, 412 ctx->page.title = fmt("%s - %s", ctx->cfg.root_title,
411 "config error"); 413 "config error");
412 tmp = fmt("Not a git repository: '%s'", ctx->repo->path); 414 tmp = fmt("Failed to open %s: %s",
415 ctx->repo->name,
416 rc ? strerror(rc) : "Not a valid git repository");
413 ctx->repo = NULL; 417 ctx->repo = NULL;
414 cgit_print_http_headers(ctx); 418 cgit_print_http_headers(ctx);
415 cgit_print_docstart(ctx); 419 cgit_print_docstart(ctx);
416 cgit_print_pageheader(ctx); 420 cgit_print_pageheader(ctx);
417 cgit_print_error(tmp); 421 cgit_print_error(tmp);
418 cgit_print_docend(); 422 cgit_print_docend();
419 return 1; 423 return 1;
420 } 424 }
421 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc); 425 ctx->page.title = fmt("%s - %s", ctx->repo->name, ctx->repo->desc);
422 426
423 if (!ctx->qry.head) { 427 if (!ctx->qry.head) {
424 ctx->qry.nohead = 1; 428 ctx->qry.nohead = 1;
425 ctx->qry.head = find_default_branch(ctx->repo); 429 ctx->qry.head = find_default_branch(ctx->repo);
426 ctx->repo->defbranch = ctx->qry.head; 430 ctx->repo->defbranch = ctx->qry.head;
427 } 431 }
428 432
429 if (!ctx->qry.head) { 433 if (!ctx->qry.head) {
430 cgit_print_http_headers(ctx); 434 cgit_print_http_headers(ctx);
431 cgit_print_docstart(ctx); 435 cgit_print_docstart(ctx);
432 cgit_print_pageheader(ctx); 436 cgit_print_pageheader(ctx);
433 cgit_print_error("Repository seems to be empty"); 437 cgit_print_error("Repository seems to be empty");
434 cgit_print_docend(); 438 cgit_print_docend();
435 return 1; 439 return 1;
436 } 440 }
437 441
438 if (get_sha1(ctx->qry.head, sha1)) { 442 if (get_sha1(ctx->qry.head, sha1)) {
439 tmp = xstrdup(ctx->qry.head); 443 tmp = xstrdup(ctx->qry.head);
440 ctx->qry.head = ctx->repo->defbranch; 444 ctx->qry.head = ctx->repo->defbranch;
441 ctx->page.status = 404; 445 ctx->page.status = 404;
442 ctx->page.statusmsg = "not found"; 446 ctx->page.statusmsg = "not found";
443 cgit_print_http_headers(ctx); 447 cgit_print_http_headers(ctx);
444 cgit_print_docstart(ctx); 448 cgit_print_docstart(ctx);
445 cgit_print_pageheader(ctx); 449 cgit_print_pageheader(ctx);
446 cgit_print_error(fmt("Invalid branch: %s", tmp)); 450 cgit_print_error(fmt("Invalid branch: %s", tmp));
447 cgit_print_docend(); 451 cgit_print_docend();
448 return 1; 452 return 1;
449 } 453 }
450 return 0; 454 return 0;
451} 455}
452 456
453static void process_request(void *cbdata) 457static void process_request(void *cbdata)
454{ 458{
455 struct cgit_context *ctx = cbdata; 459 struct cgit_context *ctx = cbdata;
456 struct cgit_cmd *cmd; 460 struct cgit_cmd *cmd;
457 461
458 cmd = cgit_get_cmd(ctx); 462 cmd = cgit_get_cmd(ctx);
459 if (!cmd) { 463 if (!cmd) {
460 ctx->page.title = "cgit error"; 464 ctx->page.title = "cgit error";