summaryrefslogtreecommitdiffabout
authorJohan Herland <johan@herland.net>2010-11-15 19:41:00 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2011-02-19 13:25:14 (UTC)
commitdf522794c38934be3229a11e0e2432a1f2a3bc8d (patch) (unidiff)
treef11aef6d303a5327303a4471d47444764bea53d8
parent682adbc0cad2baa1a6119013b166f52de3ee3352 (diff)
downloadcgit-df522794c38934be3229a11e0e2432a1f2a3bc8d.zip
cgit-df522794c38934be3229a11e0e2432a1f2a3bc8d.tar.gz
cgit-df522794c38934be3229a11e0e2432a1f2a3bc8d.tar.bz2
scan_path(): Do not recurse into hidden directories by default
Paths that start with a period ('.') are considered hidden in the Unix world. scan_path() should arguably not recurse into these directories by default. This patch makes it so, and introduces the "scan-hidden-path" config variable for overriding the new default and revert to the old behaviour (scanning _all_ directories, including hidden .directories). Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Lars Hjemli <larsh@prediktor.no>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--cgit.c3
-rw-r--r--cgit.h1
-rw-r--r--cgitrc.5.txt8
-rw-r--r--scan-tree.c2
4 files changed, 14 insertions, 0 deletions
diff --git a/cgit.c b/cgit.c
index 412fbf0..6a76281 100644
--- a/cgit.c
+++ b/cgit.c
@@ -186,24 +186,26 @@ void config_cb(const char *name, const char *value)
186 else if (!strcmp(name, "max-commit-count")) 186 else if (!strcmp(name, "max-commit-count"))
187 ctx.cfg.max_commit_count = atoi(value); 187 ctx.cfg.max_commit_count = atoi(value);
188 else if (!strcmp(name, "project-list")) 188 else if (!strcmp(name, "project-list"))
189 ctx.cfg.project_list = xstrdup(expand_macros(value)); 189 ctx.cfg.project_list = xstrdup(expand_macros(value));
190 else if (!strcmp(name, "scan-path")) 190 else if (!strcmp(name, "scan-path"))
191 if (!ctx.cfg.nocache && ctx.cfg.cache_size) 191 if (!ctx.cfg.nocache && ctx.cfg.cache_size)
192 process_cached_repolist(expand_macros(value)); 192 process_cached_repolist(expand_macros(value));
193 else if (ctx.cfg.project_list) 193 else if (ctx.cfg.project_list)
194 scan_projects(expand_macros(value), 194 scan_projects(expand_macros(value),
195 ctx.cfg.project_list, repo_config); 195 ctx.cfg.project_list, repo_config);
196 else 196 else
197 scan_tree(expand_macros(value), repo_config); 197 scan_tree(expand_macros(value), repo_config);
198 else if (!strcmp(name, "scan-hidden-path"))
199 ctx.cfg.scan_hidden_path = atoi(value);
198 else if (!strcmp(name, "section-from-path")) 200 else if (!strcmp(name, "section-from-path"))
199 ctx.cfg.section_from_path = atoi(value); 201 ctx.cfg.section_from_path = atoi(value);
200 else if (!strcmp(name, "source-filter")) 202 else if (!strcmp(name, "source-filter"))
201 ctx.cfg.source_filter = new_filter(value, 1); 203 ctx.cfg.source_filter = new_filter(value, 1);
202 else if (!strcmp(name, "summary-log")) 204 else if (!strcmp(name, "summary-log"))
203 ctx.cfg.summary_log = atoi(value); 205 ctx.cfg.summary_log = atoi(value);
204 else if (!strcmp(name, "summary-branches")) 206 else if (!strcmp(name, "summary-branches"))
205 ctx.cfg.summary_branches = atoi(value); 207 ctx.cfg.summary_branches = atoi(value);
206 else if (!strcmp(name, "summary-tags")) 208 else if (!strcmp(name, "summary-tags"))
207 ctx.cfg.summary_tags = atoi(value); 209 ctx.cfg.summary_tags = atoi(value);
208 else if (!strcmp(name, "side-by-side-diffs")) 210 else if (!strcmp(name, "side-by-side-diffs"))
209 ctx.cfg.ssdiff = atoi(value); 211 ctx.cfg.ssdiff = atoi(value);
@@ -306,24 +308,25 @@ static void prepare_context(struct cgit_context *ctx)
306 ctx->cfg.max_lock_attempts = 5; 308 ctx->cfg.max_lock_attempts = 5;
307 ctx->cfg.max_msg_len = 80; 309 ctx->cfg.max_msg_len = 80;
308 ctx->cfg.max_repodesc_len = 80; 310 ctx->cfg.max_repodesc_len = 80;
309 ctx->cfg.max_blob_size = 0; 311 ctx->cfg.max_blob_size = 0;
310 ctx->cfg.max_stats = 0; 312 ctx->cfg.max_stats = 0;
311 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s"; 313 ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
312 ctx->cfg.project_list = NULL; 314 ctx->cfg.project_list = NULL;
313 ctx->cfg.renamelimit = -1; 315 ctx->cfg.renamelimit = -1;
314 ctx->cfg.remove_suffix = 0; 316 ctx->cfg.remove_suffix = 0;
315 ctx->cfg.robots = "index, nofollow"; 317 ctx->cfg.robots = "index, nofollow";
316 ctx->cfg.root_title = "Git repository browser"; 318 ctx->cfg.root_title = "Git repository browser";
317 ctx->cfg.root_desc = "a fast webinterface for the git dscm"; 319 ctx->cfg.root_desc = "a fast webinterface for the git dscm";
320 ctx->cfg.scan_hidden_path = 0;
318 ctx->cfg.script_name = CGIT_SCRIPT_NAME; 321 ctx->cfg.script_name = CGIT_SCRIPT_NAME;
319 ctx->cfg.section = ""; 322 ctx->cfg.section = "";
320 ctx->cfg.summary_branches = 10; 323 ctx->cfg.summary_branches = 10;
321 ctx->cfg.summary_log = 10; 324 ctx->cfg.summary_log = 10;
322 ctx->cfg.summary_tags = 10; 325 ctx->cfg.summary_tags = 10;
323 ctx->cfg.max_atom_items = 10; 326 ctx->cfg.max_atom_items = 10;
324 ctx->cfg.ssdiff = 0; 327 ctx->cfg.ssdiff = 0;
325 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG")); 328 ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
326 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST")); 329 ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
327 ctx->env.https = xstrdupn(getenv("HTTPS")); 330 ctx->env.https = xstrdupn(getenv("HTTPS"));
328 ctx->env.no_http = xstrdupn(getenv("NO_HTTP")); 331 ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
329 ctx->env.path_info = xstrdupn(getenv("PATH_INFO")); 332 ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
diff --git a/cgit.h b/cgit.h
index f5f68ac..ad94905 100644
--- a/cgit.h
+++ b/cgit.h
@@ -198,24 +198,25 @@ struct cgit_config {
198 int max_repo_count; 198 int max_repo_count;
199 int max_commit_count; 199 int max_commit_count;
200 int max_lock_attempts; 200 int max_lock_attempts;
201 int max_msg_len; 201 int max_msg_len;
202 int max_repodesc_len; 202 int max_repodesc_len;
203 int max_blob_size; 203 int max_blob_size;
204 int max_stats; 204 int max_stats;
205 int nocache; 205 int nocache;
206 int noplainemail; 206 int noplainemail;
207 int noheader; 207 int noheader;
208 int renamelimit; 208 int renamelimit;
209 int remove_suffix; 209 int remove_suffix;
210 int scan_hidden_path;
210 int section_from_path; 211 int section_from_path;
211 int snapshots; 212 int snapshots;
212 int summary_branches; 213 int summary_branches;
213 int summary_log; 214 int summary_log;
214 int summary_tags; 215 int summary_tags;
215 int ssdiff; 216 int ssdiff;
216 struct string_list mimetypes; 217 struct string_list mimetypes;
217 struct cgit_filter *about_filter; 218 struct cgit_filter *about_filter;
218 struct cgit_filter *commit_filter; 219 struct cgit_filter *commit_filter;
219 struct cgit_filter *source_filter; 220 struct cgit_filter *source_filter;
220}; 221};
221 222
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 8e51ca5..1dc3cce 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -260,24 +260,32 @@ root-desc::
260 Text printed below the heading on the repository index page. Default 260 Text printed below the heading on the repository index page. Default
261 value: "a fast webinterface for the git dscm". 261 value: "a fast webinterface for the git dscm".
262 262
263root-readme:: 263root-readme::
264 The content of the file specified with this option will be included 264 The content of the file specified with this option will be included
265 verbatim below the "about" link on the repository index page. Default 265 verbatim below the "about" link on the repository index page. Default
266 value: none. 266 value: none.
267 267
268root-title:: 268root-title::
269 Text printed as heading on the repository index page. Default value: 269 Text printed as heading on the repository index page. Default value:
270 "Git Repository Browser". 270 "Git Repository Browser".
271 271
272scan-hidden-path::
273 If set to "1" and scan-path is enabled, scan-path will recurse into
274 directories whose name starts with a period ('.'). Otherwise,
275 scan-path will stay away from such directories (considered as
276 "hidden"). Note that this does not apply to the ".git" directory in
277 non-bare repos. This must be defined prior to scan-path.
278 Default value: 0. See also: scan-path.
279
272scan-path:: 280scan-path::
273 A path which will be scanned for repositories. If caching is enabled, 281 A path which will be scanned for repositories. If caching is enabled,
274 the result will be cached as a cgitrc include-file in the cache 282 the result will be cached as a cgitrc include-file in the cache
275 directory. If project-list has been defined prior to scan-path, 283 directory. If project-list has been defined prior to scan-path,
276 scan-path loads only the directories listed in the file pointed to by 284 scan-path loads only the directories listed in the file pointed to by
277 project-list. Default value: none. See also: cache-scanrc-ttl, 285 project-list. Default value: none. See also: cache-scanrc-ttl,
278 project-list. 286 project-list.
279 287
280section:: 288section::
281 The name of the current repository section - all repositories defined 289 The name of the current repository section - all repositories defined
282 after this option will inherit the current section name. Default value: 290 after this option will inherit the current section name. Default value:
283 none. 291 none.
diff --git a/scan-tree.c b/scan-tree.c
index eda8c67..627af1b 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -174,24 +174,26 @@ static void scan_path(const char *base, const char *path, repo_config_fn fn)
174 goto end; 174 goto end;
175 } 175 }
176 if (is_git_dir(fmt("%s/.git", path))) { 176 if (is_git_dir(fmt("%s/.git", path))) {
177 add_repo(base, fmt("%s/.git", path), fn); 177 add_repo(base, fmt("%s/.git", path), fn);
178 goto end; 178 goto end;
179 } 179 }
180 while((ent = readdir(dir)) != NULL) { 180 while((ent = readdir(dir)) != NULL) {
181 if (ent->d_name[0] == '.') { 181 if (ent->d_name[0] == '.') {
182 if (ent->d_name[1] == '\0') 182 if (ent->d_name[1] == '\0')
183 continue; 183 continue;
184 if (ent->d_name[1] == '.' && ent->d_name[2] == '\0') 184 if (ent->d_name[1] == '.' && ent->d_name[2] == '\0')
185 continue; 185 continue;
186 if (!ctx.cfg.scan_hidden_path)
187 continue;
186 } 188 }
187 buf = malloc(strlen(path) + strlen(ent->d_name) + 2); 189 buf = malloc(strlen(path) + strlen(ent->d_name) + 2);
188 if (!buf) { 190 if (!buf) {
189 fprintf(stderr, "Alloc error on %s: %s (%d)\n", 191 fprintf(stderr, "Alloc error on %s: %s (%d)\n",
190 path, strerror(errno), errno); 192 path, strerror(errno), errno);
191 exit(1); 193 exit(1);
192 } 194 }
193 sprintf(buf, "%s/%s", path, ent->d_name); 195 sprintf(buf, "%s/%s", path, ent->d_name);
194 if (stat(buf, &st)) { 196 if (stat(buf, &st)) {
195 fprintf(stderr, "Error checking path %s: %s (%d)\n", 197 fprintf(stderr, "Error checking path %s: %s (%d)\n",
196 buf, strerror(errno), errno); 198 buf, strerror(errno), errno);
197 free(buf); 199 free(buf);