summaryrefslogtreecommitdiffabout
path: root/scan-tree.c
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 /scan-tree.c
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 (limited to 'scan-tree.c') (more/less context) (ignore whitespace changes)
-rw-r--r--scan-tree.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/scan-tree.c b/scan-tree.c
index a0e09ce..627af1b 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -146,75 +146,77 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
repo->name += strlen(repo->section);
if (*repo->name == '/')
repo->name++;
}
}
}
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");
if (!projects) {
fprintf(stderr, "Error opening projectsfile %s: %s (%d)\n",
projectsfile, strerror(errno), errno);
}