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:
parent
02df919575
commit
d7e754b67e
2 changed files with 31 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
33
src/tree.c
33
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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue