From d7e754b67e94fbc3238ed769716e1275144589ed Mon Sep 17 00:00:00 2001 From: lisk77 Date: Mon, 25 Aug 2025 23:14:50 +0200 Subject: [PATCH] feat(tree): added an option to get the full repo path in walk and added a sort function for the path buffer --- include/tree.h | 4 +++- src/tree.c | 33 ++++++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/include/tree.h b/include/tree.h index f54509f..86adefc 100644 --- a/include/tree.h +++ b/include/tree.h @@ -10,6 +10,7 @@ #include #include +#include "utilities.h" typedef struct { char** paths; @@ -19,9 +20,10 @@ typedef struct { PathBuffer* new_path_buffer(); void add_path(PathBuffer*, char*); +void sort_path_buffer(PathBuffer*); void free_path_buffer(PathBuffer*); char* find_root(char*); -void walk(const char*, const char*, const char*, PathBuffer*); +void walk(char*, char*, char*, PathBuffer*, int, char*); void save_tree(const char*, PathBuffer*); #endif // TREE_H diff --git a/src/tree.c b/src/tree.c index e544fdd..44d589a 100644 --- a/src/tree.c +++ b/src/tree.c @@ -40,6 +40,20 @@ void add_path(PathBuffer* buffer, char* path) { buffer->paths[buffer->len++] = path_copy; } +int compare_paths(const void* a, const void* b) { + const char* s1 = *(const char**)a; + const char* s2 = *(const char**)b; + return strcmp(s1,s2); +} + +void sort_path_buffer(PathBuffer* buffer) { + if (!buffer || buffer->len <= 1) { + return; + } + + qsort(buffer->paths, buffer->len, sizeof(char*), compare_paths); +} + void free_path_buffer(PathBuffer* buffer) { if (buffer) { for (size_t i = 0; i < buffer->len; i++) { @@ -166,7 +180,7 @@ void normalize_path(char* path, char* rel) { strcpy(path, path+latest+(counter > 0 ? 1 : 0)); } -void walk(const char* base, const char* base_rel, const char* rel, PathBuffer* paths) { +void walk(char* base, char* base_rel, char* rel, PathBuffer* paths, int full_repo_path, char* repo_root_path) { DIR* dir = opendir(base); if (!dir) { return; @@ -175,6 +189,7 @@ void walk(const char* base, const char* base_rel, const char* rel, PathBuffer* p struct dirent* de; while ((de = readdir(dir)) != NULL) { if (is_dot_or_dotdot(de->d_name)) continue; + if (strcmp(de->d_name, ".merk") == 0) continue; char* child_full = join_path(base, de->d_name); if (!child_full) { @@ -204,7 +219,7 @@ void walk(const char* base, const char* base_rel, const char* rel, PathBuffer* p exit(1); } - walk(child_full, base_rel, new_rel, paths); + walk(child_full, base_rel, new_rel, paths, full_repo_path, repo_root_path); free(new_rel); } else { char* relative_path; @@ -221,9 +236,17 @@ void walk(const char* base, const char* base_rel, const char* rel, PathBuffer* p exit(1); } - normalize_path(relative_path, base_rel); - add_path(paths, relative_path); - free(relative_path); + if (!full_repo_path) { + normalize_path(relative_path, base_rel); + add_path(paths, relative_path); + free(relative_path); + } + else { + char* real_path = realpath(relative_path, NULL); + cut_path(repo_root_path, real_path); + add_path(paths, real_path); + free(relative_path); + } } free(child_full);