diff options
Diffstat (limited to 'cgit.c')
-rw-r--r-- | cgit.c | 27 |
1 files changed, 22 insertions, 5 deletions
@@ -181,9 +181,14 @@ void config_cb(const char *name, const char *value) | |||
181 | ctx.cfg.max_repo_count = atoi(value); | 181 | ctx.cfg.max_repo_count = atoi(value); |
182 | else if (!strcmp(name, "max-commit-count")) | 182 | else if (!strcmp(name, "max-commit-count")) |
183 | ctx.cfg.max_commit_count = atoi(value); | 183 | ctx.cfg.max_commit_count = atoi(value); |
184 | else if (!strcmp(name, "project-list")) | ||
185 | ctx.cfg.project_list = xstrdup(expand_macros(value)); | ||
184 | else if (!strcmp(name, "scan-path")) | 186 | else if (!strcmp(name, "scan-path")) |
185 | if (!ctx.cfg.nocache && ctx.cfg.cache_size) | 187 | if (!ctx.cfg.nocache && ctx.cfg.cache_size) |
186 | process_cached_repolist(expand_macros(value)); | 188 | process_cached_repolist(expand_macros(value)); |
189 | else if (ctx.cfg.project_list) | ||
190 | scan_projects(expand_macros(value), | ||
191 | ctx.cfg.project_list, repo_config); | ||
187 | else | 192 | else |
188 | scan_tree(expand_macros(value), repo_config); | 193 | scan_tree(expand_macros(value), repo_config); |
189 | else if (!strcmp(name, "source-filter")) | 194 | else if (!strcmp(name, "source-filter")) |
@@ -295,6 +300,7 @@ static void prepare_context(struct cgit_context *ctx) | |||
295 | ctx->cfg.max_blob_size = 0; | 300 | ctx->cfg.max_blob_size = 0; |
296 | ctx->cfg.max_stats = 0; | 301 | ctx->cfg.max_stats = 0; |
297 | ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; | 302 | ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; |
303 | ctx->cfg.project_list = NULL; | ||
298 | ctx->cfg.renamelimit = -1; | 304 | ctx->cfg.renamelimit = -1; |
299 | ctx->cfg.robots = "index, nofollow"; | 305 | ctx->cfg.robots = "index, nofollow"; |
300 | ctx->cfg.root_title = "Git repository browser"; | 306 | ctx->cfg.root_title = "Git repository browser"; |
@@ -574,7 +580,10 @@ static int generate_cached_repolist(const char *path, const char *cached_rc) | |||
574 | return errno; | 580 | return errno; |
575 | } | 581 | } |
576 | idx = cgit_repolist.count; | 582 | idx = cgit_repolist.count; |
577 | scan_tree(path, repo_config); | 583 | if (ctx.cfg.project_list) |
584 | scan_projects(path, ctx.cfg.project_list, repo_config); | ||
585 | else | ||
586 | scan_tree(path, repo_config); | ||
578 | print_repolist(f, &cgit_repolist, idx); | 587 | print_repolist(f, &cgit_repolist, idx); |
579 | if (rename(locked_rc, cached_rc)) | 588 | if (rename(locked_rc, cached_rc)) |
580 | fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", | 589 | fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", |
@@ -588,17 +597,25 @@ static void process_cached_repolist(const char *path) | |||
588 | struct stat st; | 597 | struct stat st; |
589 | char *cached_rc; | 598 | char *cached_rc; |
590 | time_t age; | 599 | time_t age; |
600 | unsigned long hash; | ||
591 | 601 | ||
592 | cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, | 602 | hash = hash_str(path); |
593 | hash_str(path))); | 603 | if (ctx.cfg.project_list) |
604 | hash += hash_str(ctx.cfg.project_list); | ||
605 | cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, hash)); | ||
594 | 606 | ||
595 | if (stat(cached_rc, &st)) { | 607 | if (stat(cached_rc, &st)) { |
596 | /* Nothing is cached, we need to scan without forking. And | 608 | /* Nothing is cached, we need to scan without forking. And |
597 | * if we fail to generate a cached repolist, we need to | 609 | * if we fail to generate a cached repolist, we need to |
598 | * invoke scan_tree manually. | 610 | * invoke scan_tree manually. |
599 | */ | 611 | */ |
600 | if (generate_cached_repolist(path, cached_rc)) | 612 | if (generate_cached_repolist(path, cached_rc)) { |
601 | scan_tree(path, repo_config); | 613 | if (ctx.cfg.project_list) |
614 | scan_projects(path, ctx.cfg.project_list, | ||
615 | repo_config); | ||
616 | else | ||
617 | scan_tree(path, repo_config); | ||
618 | } | ||
602 | return; | 619 | return; |
603 | } | 620 | } |
604 | 621 | ||