summaryrefslogtreecommitdiffabout
path: root/cgit.c
Unidiff
Diffstat (limited to 'cgit.c') (more/less context) (show whitespace changes)
-rw-r--r--cgit.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/cgit.c b/cgit.c
index d6146e2..3b3f8d9 100644
--- a/cgit.c
+++ b/cgit.c
@@ -549,129 +549,129 @@ void print_repo(FILE *f, struct cgit_repo *repo)
549 if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter) 549 if (repo->source_filter && repo->source_filter != ctx.cfg.source_filter)
550 fprintf(f, "repo.source-filter=%s\n", repo->source_filter->cmd); 550 fprintf(f, "repo.source-filter=%s\n", repo->source_filter->cmd);
551 if (repo->snapshots != ctx.cfg.snapshots) { 551 if (repo->snapshots != ctx.cfg.snapshots) {
552 char *tmp = build_snapshot_setting(repo->snapshots); 552 char *tmp = build_snapshot_setting(repo->snapshots);
553 fprintf(f, "repo.snapshots=%s\n", tmp); 553 fprintf(f, "repo.snapshots=%s\n", tmp);
554 free(tmp); 554 free(tmp);
555 } 555 }
556 if (repo->max_stats != ctx.cfg.max_stats) 556 if (repo->max_stats != ctx.cfg.max_stats)
557 fprintf(f, "repo.max-stats=%s\n", 557 fprintf(f, "repo.max-stats=%s\n",
558 cgit_find_stats_periodname(repo->max_stats)); 558 cgit_find_stats_periodname(repo->max_stats));
559 fprintf(f, "\n"); 559 fprintf(f, "\n");
560} 560}
561 561
562void print_repolist(FILE *f, struct cgit_repolist *list, int start) 562void print_repolist(FILE *f, struct cgit_repolist *list, int start)
563{ 563{
564 int i; 564 int i;
565 565
566 for(i = start; i < list->count; i++) 566 for(i = start; i < list->count; i++)
567 print_repo(f, &list->repos[i]); 567 print_repo(f, &list->repos[i]);
568} 568}
569 569
570/* Scan 'path' for git repositories, save the resulting repolist in 'cached_rc' 570/* Scan 'path' for git repositories, save the resulting repolist in 'cached_rc'
571 * and return 0 on success. 571 * and return 0 on success.
572 */ 572 */
573static int generate_cached_repolist(const char *path, const char *cached_rc) 573static int generate_cached_repolist(const char *path, const char *cached_rc)
574{ 574{
575 char *locked_rc; 575 char *locked_rc;
576 int idx; 576 int idx;
577 FILE *f; 577 FILE *f;
578 578
579 locked_rc = xstrdup(fmt("%s.lock", cached_rc)); 579 locked_rc = xstrdup(fmt("%s.lock", cached_rc));
580 f = fopen(locked_rc, "wx"); 580 f = fopen(locked_rc, "wx");
581 if (!f) { 581 if (!f) {
582 /* Inform about the error unless the lockfile already existed, 582 /* Inform about the error unless the lockfile already existed,
583 * since that only means we've got concurrent requests. 583 * since that only means we've got concurrent requests.
584 */ 584 */
585 if (errno != EEXIST) 585 if (errno != EEXIST)
586 fprintf(stderr, "[cgit] Error opening %s: %s (%d)\n", 586 fprintf(stderr, "[cgit] Error opening %s: %s (%d)\n",
587 locked_rc, strerror(errno), errno); 587 locked_rc, strerror(errno), errno);
588 return errno; 588 return errno;
589 } 589 }
590 idx = cgit_repolist.count; 590 idx = cgit_repolist.count;
591 if (ctx.cfg.project_list) 591 if (ctx.cfg.project_list)
592 scan_projects(path, ctx.cfg.project_list, repo_config); 592 scan_projects(path, ctx.cfg.project_list, repo_config);
593 else 593 else
594 scan_tree(path, repo_config); 594 scan_tree(path, repo_config);
595 print_repolist(f, &cgit_repolist, idx); 595 print_repolist(f, &cgit_repolist, idx);
596 if (rename(locked_rc, cached_rc)) 596 if (rename(locked_rc, cached_rc))
597 fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", 597 fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n",
598 locked_rc, cached_rc, strerror(errno), errno); 598 locked_rc, cached_rc, strerror(errno), errno);
599 fclose(f); 599 fclose(f);
600 return 0; 600 return 0;
601} 601}
602 602
603static void process_cached_repolist(const char *path) 603static void process_cached_repolist(const char *path)
604{ 604{
605 struct stat st; 605 struct stat st;
606 char *cached_rc; 606 char *cached_rc;
607 time_t age; 607 time_t age;
608 unsigned long hash; 608 unsigned long hash;
609 609
610 hash = hash_str(path); 610 hash = hash_str(path);
611 if (ctx.cfg.project_list) 611 if (ctx.cfg.project_list)
612 hash += hash_str(ctx.cfg.project_list); 612 hash += hash_str(ctx.cfg.project_list);
613 cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, hash)); 613 cached_rc = xstrdup(fmt("%s/rc-%8lx", ctx.cfg.cache_root, hash));
614 614
615 if (stat(cached_rc, &st)) { 615 if (stat(cached_rc, &st)) {
616 /* Nothing is cached, we need to scan without forking. And 616 /* Nothing is cached, we need to scan without forking. And
617 * if we fail to generate a cached repolist, we need to 617 * if we fail to generate a cached repolist, we need to
618 * invoke scan_tree manually. 618 * invoke scan_tree manually.
619 */ 619 */
620 if (generate_cached_repolist(path, cached_rc)) { 620 if (generate_cached_repolist(path, cached_rc)) {
621 if (ctx.cfg.project_list) 621 if (ctx.cfg.project_list)
622 scan_projects(path, ctx.cfg.project_list, 622 scan_projects(path, ctx.cfg.project_list,
623 repo_config); 623 repo_config);
624 else 624 else
625 scan_tree(path, repo_config); 625 scan_tree(path, repo_config);
626 } 626 }
627 return; 627 return;
628 } 628 }
629 629
630 parse_configfile(cached_rc, config_cb); 630 parse_configfile(cached_rc, config_cb);
631 631
632 /* If the cached configfile hasn't expired, lets exit now */ 632 /* If the cached configfile hasn't expired, lets exit now */
633 age = time(NULL) - st.st_mtime; 633 age = time(NULL) - st.st_mtime;
634 if (age <= (ctx.cfg.cache_scanrc_ttl * 60)) 634 if (age <= (ctx.cfg.cache_scanrc_ttl * 60))
635 return; 635 return;
636 636
637 /* The cached repolist has been parsed, but it was old. So lets 637 /* The cached repolist has been parsed, but it was old. So lets
638 * rescan the specified path and generate a new cached repolist 638 * rescan the specified path and generate a new cached repolist
639 * in a child-process to avoid latency for the current request. 639 * in a child-process to avoid latency for the current request.
640 */ 640 */
641 if (fork()) 641 if (fork())
642 return; 642 return;
643 643
644 exit(generate_cached_repolist(path, cached_rc)); 644 exit(generate_cached_repolist(path, cached_rc));
645} 645}
646 646
647static void cgit_parse_args(int argc, const char **argv) 647static void cgit_parse_args(int argc, const char **argv)
648{ 648{
649 int i; 649 int i;
650 int scan = 0; 650 int scan = 0;
651 651
652 for (i = 1; i < argc; i++) { 652 for (i = 1; i < argc; i++) {
653 if (!strncmp(argv[i], "--cache=", 8)) { 653 if (!strncmp(argv[i], "--cache=", 8)) {
654 ctx.cfg.cache_root = xstrdup(argv[i]+8); 654 ctx.cfg.cache_root = xstrdup(argv[i]+8);
655 } 655 }
656 if (!strcmp(argv[i], "--nocache")) { 656 if (!strcmp(argv[i], "--nocache")) {
657 ctx.cfg.nocache = 1; 657 ctx.cfg.nocache = 1;
658 } 658 }
659 if (!strcmp(argv[i], "--nohttp")) { 659 if (!strcmp(argv[i], "--nohttp")) {
660 ctx.env.no_http = "1"; 660 ctx.env.no_http = "1";
661 } 661 }
662 if (!strncmp(argv[i], "--query=", 8)) { 662 if (!strncmp(argv[i], "--query=", 8)) {
663 ctx.qry.raw = xstrdup(argv[i]+8); 663 ctx.qry.raw = xstrdup(argv[i]+8);
664 } 664 }
665 if (!strncmp(argv[i], "--repo=", 7)) { 665 if (!strncmp(argv[i], "--repo=", 7)) {
666 ctx.qry.repo = xstrdup(argv[i]+7); 666 ctx.qry.repo = xstrdup(argv[i]+7);
667 } 667 }
668 if (!strncmp(argv[i], "--page=", 7)) { 668 if (!strncmp(argv[i], "--page=", 7)) {
669 ctx.qry.page = xstrdup(argv[i]+7); 669 ctx.qry.page = xstrdup(argv[i]+7);
670 } 670 }
671 if (!strncmp(argv[i], "--head=", 7)) { 671 if (!strncmp(argv[i], "--head=", 7)) {
672 ctx.qry.head = xstrdup(argv[i]+7); 672 ctx.qry.head = xstrdup(argv[i]+7);
673 ctx.qry.has_symref = 1; 673 ctx.qry.has_symref = 1;
674 } 674 }
675 if (!strncmp(argv[i], "--sha1=", 7)) { 675 if (!strncmp(argv[i], "--sha1=", 7)) {
676 ctx.qry.sha1 = xstrdup(argv[i]+7); 676 ctx.qry.sha1 = xstrdup(argv[i]+7);
677 ctx.qry.has_sha1 = 1; 677 ctx.qry.has_sha1 = 1;