diff options
| author | frosty <frostinator33@airmail.cc> | 2026-10-03 13:30:21 -0400 |
|---|---|---|
| committer | frosty <frostinator33@airmail.cc> | 2026-10-03 13:30:21 -0400 |
| commit | 65500761a632d22057d3b3e709b91dde168e125b (patch) | |
| tree | 0ff30abf8de4120e5ed8db296688e0d85b65736b /src/FileProcessor/FileProcessor.c | |
| parent | cb716af752fb0b46aa8f78d3cbd5189a09642f39 (diff) | |
feat: add --exclude/--include
Diffstat (limited to 'src/FileProcessor/FileProcessor.c')
| -rw-r--r-- | src/FileProcessor/FileProcessor.c | 45 |
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); |
