From 65500761a632d22057d3b3e709b91dde168e125b Mon Sep 17 00:00:00 2001 From: frosty Date: Sat, 3 Oct 2026 13:30:21 -0400 Subject: feat: add --exclude/--include --- src/FileProcessor/FileProcessor.c | 45 +++++++++++++++++++++++++++++++-------- src/FileProcessor/FileProcessor.h | 4 +++- 2 files changed, 39 insertions(+), 10 deletions(-) (limited to 'src/FileProcessor') 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 #include @@ -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); diff --git a/src/FileProcessor/FileProcessor.h b/src/FileProcessor/FileProcessor.h index 90027d7..55a00bb 100644 --- a/src/FileProcessor/FileProcessor.h +++ b/src/FileProcessor/FileProcessor.h @@ -1,8 +1,10 @@ #ifndef YAPSSG_FILE_PROCESSOR_H #define YAPSSG_FILE_PROCESSOR_H +#include "Pattern/Pattern.h" + int process_file(const char *input_path, const char *output_path); int process_directory(const char *input_path, const char *output_path, - int overwrite_output); + int overwrite_output, const PatternList *patterns); #endif -- cgit v1.3