aboutsummaryrefslogtreecommitdiff
path: root/src/FileProcessor/FileProcessor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/FileProcessor/FileProcessor.c')
-rw-r--r--src/FileProcessor/FileProcessor.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/src/FileProcessor/FileProcessor.c b/src/FileProcessor/FileProcessor.c
index d856fb4..84efece 100644
--- a/src/FileProcessor/FileProcessor.c
+++ b/src/FileProcessor/FileProcessor.c
@@ -6,6 +6,7 @@
#include "Logger/Logger.h"
#include "LuaEngine/LuaEngine.h"
#include "Path/Path.h"
+#include "Pattern/Pattern.h"
#include <dirent.h>
#include <errno.h>
@@ -206,28 +207,49 @@ static int copy_symlink(const char *input_path, const char *output_path,
return 0;
}
-static int copy_tree(const char *input_path, const char *output_path) {
+static int copy_tree(const char *input_path, const char *output_path,
+ const char *relative_path, const PatternList *patterns,
+ PatternKind subtree_kind) {
struct stat status;
DIR *directory;
+ PatternKind contents_kind;
int result = 0;
if (lstat(input_path, &status) != 0) {
logger_error("cannot inspect %s: %s", input_path, strerror(errno));
return -1;
}
- if (S_ISLNK(status.st_mode)) {
- return copy_symlink(input_path, output_path, &status);
- }
- if (S_ISREG(status.st_mode)) {
+
+ if (S_ISLNK(status.st_mode) || S_ISREG(status.st_mode)) {
+ if (pattern_list_resolve(patterns, relative_path, 0, subtree_kind) ==
+ PATTERN_EXCLUDE) {
+ logger_debug("excluding %s", input_path);
+ return 0;
+ }
+ if (S_ISLNK(status.st_mode)) {
+ return copy_symlink(input_path, output_path, &status);
+ }
return has_html_extension(input_path)
? process_file(input_path, output_path)
: copy_regular_file(input_path, output_path, status.st_mode);
}
+
if (!S_ISDIR(status.st_mode)) {
logger_error("unsupported file type: %s", input_path);
return -1;
}
+ if (relative_path[0] == '\0') {
+ contents_kind = pattern_list_default_kind(patterns);
+ } else {
+ contents_kind =
+ pattern_list_resolve(patterns, relative_path, 1, subtree_kind);
+ if (contents_kind == PATTERN_EXCLUDE) {
+ logger_debug("excluding directory %s", input_path);
+ return 0;
+ }
+ }
+
if (mkdir(output_path, status.st_mode & 0777) != 0) {
logger_error("cannot create directory %s: %s", output_path,
strerror(errno));
@@ -244,6 +266,7 @@ static int copy_tree(const char *input_path, const char *output_path) {
struct dirent *entry;
char *input_child;
char *output_child;
+ char *relative_child;
errno = 0;
entry = readdir(directory);
@@ -261,14 +284,17 @@ static int copy_tree(const char *input_path, const char *output_path) {
input_child = path_join(input_path, entry->d_name);
output_child = path_join(output_path, entry->d_name);
- if (input_child == NULL || output_child == NULL) {
+ relative_child = path_join(relative_path, entry->d_name);
+ if (input_child == NULL || output_child == NULL || relative_child == NULL) {
logger_error("unable to allocate child path");
result = -1;
} else {
- result = copy_tree(input_child, output_child);
+ result = copy_tree(input_child, output_child, relative_child, patterns,
+ contents_kind);
}
free(input_child);
free(output_child);
+ free(relative_child);
}
if (closedir(directory) != 0 && result == 0) {
@@ -346,7 +372,7 @@ static int remove_tree(const char *path) {
}
int process_directory(const char *input_path, const char *output_path,
- int overwrite_output) {
+ int overwrite_output, const PatternList *patterns) {
struct stat status;
struct stat output_status;
char *resolved_input;
@@ -387,7 +413,8 @@ int process_directory(const char *input_path, const char *output_path,
result = -1;
} else {
logger_info("processing directory %s -> %s", input_path, output_path);
- result = copy_tree(input_path, output_path);
+ result = copy_tree(input_path, output_path, "", patterns,
+ pattern_list_default_kind(patterns));
}
free(resolved_input);