summaryrefslogtreecommitdiffabout
path: root/cgit.c
Unidiff
Diffstat (limited to 'cgit.c') (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/cgit.c b/cgit.c
index c263872..eff5b7a 100644
--- a/cgit.c
+++ b/cgit.c
@@ -132,12 +132,14 @@ void config_cb(const char *name, const char *value)
132 else if (!strcmp(name, "noheader")) 132 else if (!strcmp(name, "noheader"))
133 ctx.cfg.noheader = atoi(value); 133 ctx.cfg.noheader = atoi(value);
134 else if (!strcmp(name, "snapshots")) 134 else if (!strcmp(name, "snapshots"))
135 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value); 135 ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
136 else if (!strcmp(name, "enable-filter-overrides")) 136 else if (!strcmp(name, "enable-filter-overrides"))
137 ctx.cfg.enable_filter_overrides = atoi(value); 137 ctx.cfg.enable_filter_overrides = atoi(value);
138 else if (!strcmp(name, "enable-gitweb-owner"))
139 ctx.cfg.enable_gitweb_owner = atoi(value);
138 else if (!strcmp(name, "enable-index-links")) 140 else if (!strcmp(name, "enable-index-links"))
139 ctx.cfg.enable_index_links = atoi(value); 141 ctx.cfg.enable_index_links = atoi(value);
140 else if (!strcmp(name, "enable-log-filecount")) 142 else if (!strcmp(name, "enable-log-filecount"))
141 ctx.cfg.enable_log_filecount = atoi(value); 143 ctx.cfg.enable_log_filecount = atoi(value);
142 else if (!strcmp(name, "enable-log-linecount")) 144 else if (!strcmp(name, "enable-log-linecount"))
143 ctx.cfg.enable_log_linecount = atoi(value); 145 ctx.cfg.enable_log_linecount = atoi(value);
@@ -178,15 +180,20 @@ void config_cb(const char *name, const char *value)
178 else if (!strcmp(name, "max-blob-size")) 180 else if (!strcmp(name, "max-blob-size"))
179 ctx.cfg.max_blob_size = atoi(value); 181 ctx.cfg.max_blob_size = atoi(value);
180 else if (!strcmp(name, "max-repo-count")) 182 else if (!strcmp(name, "max-repo-count"))
181 ctx.cfg.max_repo_count = atoi(value); 183 ctx.cfg.max_repo_count = atoi(value);
182 else if (!strcmp(name, "max-commit-count")) 184 else if (!strcmp(name, "max-commit-count"))
183 ctx.cfg.max_commit_count = atoi(value); 185 ctx.cfg.max_commit_count = atoi(value);
186 else if (!strcmp(name, "project-list"))
187 ctx.cfg.project_list = xstrdup(expand_macros(value));
184 else if (!strcmp(name, "scan-path")) 188 else if (!strcmp(name, "scan-path"))
185 if (!ctx.cfg.nocache && ctx.cfg.cache_size) 189 if (!ctx.cfg.nocache && ctx.cfg.cache_size)
186 process_cached_repolist(expand_macros(value)); 190 process_cached_repolist(expand_macros(value));
191 else if (ctx.cfg.project_list)
192 scan_projects(expand_macros(value),
193 ctx.cfg.project_list, repo_config);
187 else 194 else
188 scan_tree(expand_macros(value), repo_config); 195 scan_tree(expand_macros(value), repo_config);
189 else if (!strcmp(name, "source-filter")) 196 else if (!strcmp(name, "source-filter"))
190 ctx.cfg.source_filter = new_filter(value, 1); 197 ctx.cfg.source_filter = new_filter(value, 1);
191 else if (!strcmp(name, "summary-log")) 198 else if (!strcmp(name, "summary-log"))
192 ctx.cfg.summary_log = atoi(value); 199 ctx.cfg.summary_log = atoi(value);
@@ -197,12 +204,14 @@ void config_cb(const char *name, const char *value)
197 else if (!strcmp(name, "side-by-side-diffs")) 204 else if (!strcmp(name, "side-by-side-diffs"))
198 ctx.cfg.ssdiff = atoi(value); 205 ctx.cfg.ssdiff = atoi(value);
199 else if (!strcmp(name, "agefile")) 206 else if (!strcmp(name, "agefile"))
200 ctx.cfg.agefile = xstrdup(value); 207 ctx.cfg.agefile = xstrdup(value);
201 else if (!strcmp(name, "renamelimit")) 208 else if (!strcmp(name, "renamelimit"))
202 ctx.cfg.renamelimit = atoi(value); 209 ctx.cfg.renamelimit = atoi(value);
210 else if (!strcmp(name, "remove-suffix"))
211 ctx.cfg.remove_suffix = atoi(value);
203 else if (!strcmp(name, "robots")) 212 else if (!strcmp(name, "robots"))
204 ctx.cfg.robots = xstrdup(value); 213 ctx.cfg.robots = xstrdup(value);
205 else if (!strcmp(name, "clone-prefix")) 214 else if (!strcmp(name, "clone-prefix"))
206 ctx.cfg.clone_prefix = xstrdup(value); 215 ctx.cfg.clone_prefix = xstrdup(value);
207 else if (!strcmp(name, "local-time")) 216 else if (!strcmp(name, "local-time"))
208 ctx.cfg.local_time = atoi(value); 217 ctx.cfg.local_time = atoi(value);
@@ -283,22 +292,25 @@ static void prepare_context(struct cgit_context *ctx)
283 ctx->cfg.cache_root_ttl = 5; 292 ctx->cfg.cache_root_ttl = 5;
284 ctx->cfg.cache_scanrc_ttl = 15; 293 ctx->cfg.cache_scanrc_ttl = 15;
285 ctx->cfg.cache_static_ttl = -1; 294 ctx->cfg.cache_static_ttl = -1;
286 ctx->cfg.css = "/cgit.css"; 295 ctx->cfg.css = "/cgit.css";
287 ctx->cfg.logo = "/cgit.png"; 296 ctx->cfg.logo = "/cgit.png";
288 ctx->cfg.local_time = 0; 297 ctx->cfg.local_time = 0;
298 ctx->cfg.enable_gitweb_owner = 1;
289 ctx->cfg.enable_tree_linenumbers = 1; 299 ctx->cfg.enable_tree_linenumbers = 1;
290 ctx->cfg.max_repo_count = 50; 300 ctx->cfg.max_repo_count = 50;
291 ctx->cfg.max_commit_count = 50; 301 ctx->cfg.max_commit_count = 50;
292 ctx->cfg.max_lock_attempts = 5; 302 ctx->cfg.max_lock_attempts = 5;
293 ctx->cfg.max_msg_len = 80; 303 ctx->cfg.max_msg_len = 80;
294 ctx->cfg.max_repodesc_len = 80; 304 ctx->cfg.max_repodesc_len = 80;
295 ctx->cfg.max_blob_size = 0; 305 ctx->cfg.max_blob_size = 0;
296 ctx->cfg.max_stats = 0; 306 ctx->cfg.max_stats = 0;
297 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 307 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
308 ctx->cfg.project_list = NULL;
298 ctx->cfg.renamelimit = -1; 309 ctx->cfg.renamelimit = -1;
310 ctx->cfg.remove_suffix = 0;
299 ctx->cfg.robots = "index, nofollow"; 311 ctx->cfg.robots = "index, nofollow";
300 ctx->cfg.root_title = "Git repository browser"; 312 ctx->cfg.root_title = "Git repository browser";
301 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 313 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
302 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 314 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
303 ctx->cfg.section = ""; 315 ctx->cfg.section = "";
304 ctx->cfg.summary_branches = 10; 316 ctx->cfg.summary_branches = 10;
@@ -571,13 +583,16 @@ static int generate_cached_repolist(const char *path, const char *cached_rc)
571 if (errno != EEXIST) 583 if (errno != EEXIST)
572 fprintf(stderr, "[cgit] Error opening %s: %s (%d)\n", 584 fprintf(stderr, "[cgit] Error opening %s: %s (%d)\n",
573 locked_rc, strerror(errno), errno); 585 locked_rc, strerror(errno), errno);
574 return errno; 586 return errno;
575 } 587 }
576 idx = cgit_repolist.count; 588 idx = cgit_repolist.count;
577 scan_tree(path, repo_config); 589 if (ctx.cfg.project_list)
590 scan_projects(path, ctx.cfg.project_list, repo_config);
591 else
592 scan_tree(path, repo_config);
578 print_repolist(f, &cgit_repolist, idx); 593 print_repolist(f, &cgit_repolist, idx);
579 if (rename(locked_rc, cached_rc)) 594 if (rename(locked_rc, cached_rc))
580 fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n", 595 fprintf(stderr, "[cgit] Error renaming %s to %s: %s (%d)\n",
581 locked_rc, cached_rc, strerror(errno), errno); 596 locked_rc, cached_rc, strerror(errno), errno);
582 fclose(f); 597 fclose(f);
583 return 0; 598 return 0;
@@ -585,23 +600,31 @@ static int generate_cached_repolist(const char *path, const char *cached_rc)
585 600
586static void process_cached_repolist(const char *path) 601static void process_cached_repolist(const char *path)
587{ 602{
588 struct stat st; 603 struct stat st;
589 char *cached_rc; 604 char *cached_rc;
590 time_t age; 605 time_t age;
606 unsigned long hash;
591 607
592 cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, 608 hash = hash_str(path);
593 hash_str(path))); 609 if (ctx.cfg.project_list)
610 hash += hash_str(ctx.cfg.project_list);
611 cached_rc = xstrdup(fmt("%s/rc-%8x", ctx.cfg.cache_root, hash));
594 612
595 if (stat(cached_rc, &st)) { 613 if (stat(cached_rc, &st)) {
596 /* Nothing is cached, we need to scan without forking. And 614 /* Nothing is cached, we need to scan without forking. And
597 * if we fail to generate a cached repolist, we need to 615 * if we fail to generate a cached repolist, we need to
598 * invoke scan_tree manually. 616 * invoke scan_tree manually.
599 */ 617 */
600 if (generate_cached_repolist(path, cached_rc)) 618 if (generate_cached_repolist(path, cached_rc)) {
601 scan_tree(path, repo_config); 619 if (ctx.cfg.project_list)
620 scan_projects(path, ctx.cfg.project_list,
621 repo_config);
622 else
623 scan_tree(path, repo_config);
624 }
602 return; 625 return;
603 } 626 }
604 627
605 parse_configfile(cached_rc, config_cb); 628 parse_configfile(cached_rc, config_cb);
606 629
607 /* If the cached configfile hasn't expired, lets exit now */ 630 /* If the cached configfile hasn't expired, lets exit now */