summaryrefslogtreecommitdiffabout
authorLars Hjemli <hjemli@gmail.com>2011-02-19 13:25:55 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2011-02-19 13:25:55 (UTC)
commitfb9e6d1594a24fe4e551fd57a9c91fd18b14806e (patch) (side-by-side diff)
treebc0b99adcce3a19f127e6eb2509585ed9486831e
parent31e1f9af1d46bd7dfdb3b2ac580c0d0cc8dbaa63 (diff)
parentdf522794c38934be3229a11e0e2432a1f2a3bc8d (diff)
downloadcgit-fb9e6d1594a24fe4e551fd57a9c91fd18b14806e.zip
cgit-fb9e6d1594a24fe4e551fd57a9c91fd18b14806e.tar.gz
cgit-fb9e6d1594a24fe4e551fd57a9c91fd18b14806e.tar.bz2
Merge branch 'jh/scan-path'
* jh/scan-path: scan_path(): Do not recurse into hidden directories by default scan_path(): Improve handling of inaccessible directories
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.c20
4 files changed, 23 insertions, 9 deletions
diff --git a/cgit.c b/cgit.c
index 53ab68d..71f3fc8 100644
--- a/cgit.c
+++ b/cgit.c
@@ -190,24 +190,26 @@ void config_cb(const char *name, const char *value)
else if (!strcmp(name, "max-commit-count"))
ctx.cfg.max_commit_count = atoi(value);
else if (!strcmp(name, "project-list"))
ctx.cfg.project_list = xstrdup(expand_macros(value));
else if (!strcmp(name, "scan-path"))
if (!ctx.cfg.nocache && ctx.cfg.cache_size)
process_cached_repolist(expand_macros(value));
else if (ctx.cfg.project_list)
scan_projects(expand_macros(value),
ctx.cfg.project_list, repo_config);
else
scan_tree(expand_macros(value), repo_config);
+ else if (!strcmp(name, "scan-hidden-path"))
+ ctx.cfg.scan_hidden_path = atoi(value);
else if (!strcmp(name, "section-from-path"))
ctx.cfg.section_from_path = atoi(value);
else if (!strcmp(name, "source-filter"))
ctx.cfg.source_filter = new_filter(value, 1);
else if (!strcmp(name, "summary-log"))
ctx.cfg.summary_log = atoi(value);
else if (!strcmp(name, "summary-branches"))
ctx.cfg.summary_branches = atoi(value);
else if (!strcmp(name, "summary-tags"))
ctx.cfg.summary_tags = atoi(value);
else if (!strcmp(name, "side-by-side-diffs"))
ctx.cfg.ssdiff = atoi(value);
@@ -310,24 +312,25 @@ static void prepare_context(struct cgit_context *ctx)
ctx->cfg.max_lock_attempts = 5;
ctx->cfg.max_msg_len = 80;
ctx->cfg.max_repodesc_len = 80;
ctx->cfg.max_blob_size = 0;
ctx->cfg.max_stats = 0;
ctx->cfg.module_link = "./?repo=%s&page=commit&id=%s";
ctx->cfg.project_list = NULL;
ctx->cfg.renamelimit = -1;
ctx->cfg.remove_suffix = 0;
ctx->cfg.robots = "index, nofollow";
ctx->cfg.root_title = "Git repository browser";
ctx->cfg.root_desc = "a fast webinterface for the git dscm";
+ ctx->cfg.scan_hidden_path = 0;
ctx->cfg.script_name = CGIT_SCRIPT_NAME;
ctx->cfg.section = "";
ctx->cfg.summary_branches = 10;
ctx->cfg.summary_log = 10;
ctx->cfg.summary_tags = 10;
ctx->cfg.max_atom_items = 10;
ctx->cfg.ssdiff = 0;
ctx->env.cgit_config = xstrdupn(getenv("CGIT_CONFIG"));
ctx->env.http_host = xstrdupn(getenv("HTTP_HOST"));
ctx->env.https = xstrdupn(getenv("HTTPS"));
ctx->env.no_http = xstrdupn(getenv("NO_HTTP"));
ctx->env.path_info = xstrdupn(getenv("PATH_INFO"));
diff --git a/cgit.h b/cgit.h
index bed770b..74aa340 100644
--- a/cgit.h
+++ b/cgit.h
@@ -201,24 +201,25 @@ struct cgit_config {
int max_repo_count;
int max_commit_count;
int max_lock_attempts;
int max_msg_len;
int max_repodesc_len;
int max_blob_size;
int max_stats;
int nocache;
int noplainemail;
int noheader;
int renamelimit;
int remove_suffix;
+ int scan_hidden_path;
int section_from_path;
int snapshots;
int summary_branches;
int summary_log;
int summary_tags;
int ssdiff;
struct string_list mimetypes;
struct cgit_filter *about_filter;
struct cgit_filter *commit_filter;
struct cgit_filter *source_filter;
};
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 3c20fe1..a832830 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -265,24 +265,32 @@ root-desc::
Text printed below the heading on the repository index page. Default
value: "a fast webinterface for the git dscm".
root-readme::
The content of the file specified with this option will be included
verbatim below the "about" link on the repository index page. Default
value: none.
root-title::
Text printed as heading on the repository index page. Default value:
"Git Repository Browser".
+scan-hidden-path::
+ If set to "1" and scan-path is enabled, scan-path will recurse into
+ directories whose name starts with a period ('.'). Otherwise,
+ scan-path will stay away from such directories (considered as
+ "hidden"). Note that this does not apply to the ".git" directory in
+ non-bare repos. This must be defined prior to scan-path.
+ Default value: 0. See also: scan-path.
+
scan-path::
A path which will be scanned for repositories. If caching is enabled,
the result will be cached as a cgitrc include-file in the cache
directory. If project-list has been defined prior to scan-path,
scan-path loads only the directories listed in the file pointed to by
project-list. Default value: none. See also: cache-scanrc-ttl,
project-list.
section::
The name of the current repository section - all repositories defined
after this option will inherit the current section name. Default value:
none.
diff --git a/scan-tree.c b/scan-tree.c
index a0e09ce..627af1b 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -150,67 +150,69 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
}
}
p = fmt("%s/cgitrc", path);
if (!stat(p, &st)) {
config_fn = fn;
parse_configfile(xstrdup(p), &repo_config);
}
}
static void scan_path(const char *base, const char *path, repo_config_fn fn)
{
- DIR *dir;
+ DIR *dir = opendir(path);
struct dirent *ent;
char *buf;
struct stat st;
+ if (!dir) {
+ fprintf(stderr, "Error opening directory %s: %s (%d)\n",
+ path, strerror(errno), errno);
+ return;
+ }
if (is_git_dir(path)) {
add_repo(base, path, fn);
- return;
+ goto end;
}
if (is_git_dir(fmt("%s/.git", path))) {
add_repo(base, fmt("%s/.git", path), fn);
- return;
- }
- dir = opendir(path);
- if (!dir) {
- fprintf(stderr, "Error opening directory %s: %s (%d)\n",
- path, strerror(errno), errno);
- return;
+ goto end;
}
while((ent = readdir(dir)) != NULL) {
if (ent->d_name[0] == '.') {
if (ent->d_name[1] == '\0')
continue;
if (ent->d_name[1] == '.' && ent->d_name[2] == '\0')
continue;
+ if (!ctx.cfg.scan_hidden_path)
+ continue;
}
buf = malloc(strlen(path) + strlen(ent->d_name) + 2);
if (!buf) {
fprintf(stderr, "Alloc error on %s: %s (%d)\n",
path, strerror(errno), errno);
exit(1);
}
sprintf(buf, "%s/%s", path, ent->d_name);
if (stat(buf, &st)) {
fprintf(stderr, "Error checking path %s: %s (%d)\n",
buf, strerror(errno), errno);
free(buf);
continue;
}
if (S_ISDIR(st.st_mode))
scan_path(base, buf, fn);
free(buf);
}
+end:
closedir(dir);
}
#define lastc(s) s[strlen(s) - 1]
void scan_projects(const char *path, const char *projectsfile, repo_config_fn fn)
{
char line[MAX_PATH * 2], *z;
FILE *projects;
int err;
projects = fopen(projectsfile, "r");