feat(tree): added an option to get the full repo path in walk and added a sort function for the path buffer

This commit is contained in:
lisk77 2025-08-25 23:14:50 +02:00
parent 02df919575
commit d7e754b67e
2 changed files with 31 additions and 6 deletions

View file

@ -10,6 +10,7 @@
#include <unistd.h>
#include <zlib.h>
#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

View file

@ -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,10 +236,18 @@ void walk(const char* base, const char* base_rel, const char* rel, PathBuffer* p
exit(1);
}
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);
}