develop #3

Merged
Fabel merged 12 commits from develop into main 2025-01-19 21:37:41 +00:00
1 changed files with 41 additions and 38 deletions
Showing only changes of commit fb66c6f510 - Show all commits

View File

@ -7,20 +7,26 @@ namespace fs = std::filesystem;
bool TreeStructurer::should_ignore_dir(const std::string& dirname) { bool TreeStructurer::should_ignore_dir(const std::string& dirname) {
static const std::vector<std::string> ignore_list = { static const std::vector<std::string> ignore_list = {
"build", "venv", "myenv", "dist", "node_modules", "CMakeFiles", "build", "venv", "myenv", "dist", "node_modules", "CMakeFiles",
".git", ".idea", ".vscode", "__pycache__" ".git", ".idea", ".vscode", "__pycache__", "**pycache**"
}; };
if (std::find(ignore_list.begin(), ignore_list.end(), dirname) != ignore_list.end()) { if (std::find(ignore_list.begin(), ignore_list.end(), dirname) != ignore_list.end()) {
return true; return true;
} }
if (!dirname.empty() && (dirname[0] == '.' || dirname[0] == '_')) { if (!dirname.empty()) {
return true; if (dirname[0] == '.' || dirname[0] == '_') {
return true;
}
if (dirname.find("__") == 0 && dirname.find("__", 2) != std::string::npos) {
return true;
}
} }
return false; return false;
} }
// Add the missing should_ignore_file implementation
bool TreeStructurer::should_ignore_file(const std::string& filename) { bool TreeStructurer::should_ignore_file(const std::string& filename) {
static const std::vector<std::string> ignore_extensions = { static const std::vector<std::string> ignore_extensions = {
".pyc", ".pyo", ".pyd", ".so", ".dll", ".dylib", ".pyc", ".pyo", ".pyd", ".so", ".dll", ".dylib",
@ -40,6 +46,12 @@ bool TreeStructurer::should_ignore_file(const std::string& filename) {
return false; return false;
} }
// Add the missing get_relative_path implementation
std::string TreeStructurer::get_relative_path(const fs::path& path, const fs::path& base) {
fs::path rel = fs::relative(path, base);
return rel.string();
}
std::vector<fs::path> TreeStructurer::get_filtered_paths(const fs::path& start) { std::vector<fs::path> TreeStructurer::get_filtered_paths(const fs::path& start) {
std::vector<fs::path> paths; std::vector<fs::path> paths;
fs::directory_options options = fs::directory_options::skip_permission_denied; fs::directory_options options = fs::directory_options::skip_permission_denied;
@ -51,7 +63,6 @@ std::vector<fs::path> TreeStructurer::get_filtered_paths(const fs::path& start)
for (const auto& entry : fs::recursive_directory_iterator(start, options)) { for (const auto& entry : fs::recursive_directory_iterator(start, options)) {
const auto& path = entry.path(); const auto& path = entry.path();
// Check if any parent directory should be ignored
bool should_skip = false; bool should_skip = false;
for (const auto& component : path) { for (const auto& component : path) {
if (should_ignore_dir(component.string())) { if (should_ignore_dir(component.string())) {
@ -62,11 +73,11 @@ std::vector<fs::path> TreeStructurer::get_filtered_paths(const fs::path& start)
if (should_skip) continue; if (should_skip) continue;
if (entry.is_directory()) { if (entry.is_directory()) {
if (should_ignore_dir(path.filename().string())) { if (!should_ignore_dir(path.filename().string())) {
paths.push_back(path); paths.push_back(path);
} }
} else { } else {
if (should_ignore_file(path.filename().string())) { if (!should_ignore_file(path.filename().string())) {
paths.push_back(path); paths.push_back(path);
} }
} }
@ -80,55 +91,47 @@ std::vector<fs::path> TreeStructurer::get_filtered_paths(const fs::path& start)
return paths; return paths;
} }
std::string TreeStructurer::get_relative_path(const fs::path& path, const fs::path& base) {
fs::path rel = fs::relative(path, base);
return rel.string();
}
std::vector<std::string> TreeStructurer::get_directory_structure(const std::string& startpath) { std::vector<std::string> TreeStructurer::get_directory_structure(const std::string& startpath) {
std::vector<std::string> result; std::vector<std::string> result;
fs::path start = startpath.empty() ? fs::current_path() : fs::path(startpath);
// Normalize the input path by removing ./ or .\ prefix if present
std::string normalized_path = startpath;
if (startpath.substr(0, 2) == ".\\" || startpath.substr(0, 2) == "./") {
normalized_path = startpath.substr(2);
}
fs::path start = normalized_path.empty() ? fs::current_path() : fs::path(normalized_path);
try { try {
auto paths = get_filtered_paths(start); auto paths = get_filtered_paths(start);
if (paths.empty()) return result; if (paths.empty()) return result;
// Don't add the root directory name if we're in the current directory // Don't add the start directory name to the output
if (start != fs::current_path()) { // Remove the following lines:
result.push_back(start.filename().string()); // if (start != fs::current_path()) {
} // result.push_back(start.filename().string());
// }
std::vector<bool> is_last_at_level(256, false); std::vector<bool> is_last_at_level(256, false);
std::string last_prefix;
for (size_t i = 1; i < paths.size(); ++i) { for (size_t i = 1; i < paths.size(); ++i) {
const auto& path = paths[i]; const auto& path = paths[i];
std::string rel_path = get_relative_path(path, start); std::string rel_path = get_relative_path(path, start);
// Split the path into components and check each component
bool should_skip = false;
for (const auto& component : fs::path(rel_path)) {
if (should_ignore_dir(component.string())) {
should_skip = true;
break;
}
}
if (should_skip) continue;
int level = std::count(rel_path.begin(), rel_path.end(), fs::path::preferred_separator); int level = std::count(rel_path.begin(), rel_path.end(), fs::path::preferred_separator);
// Check if this is the last item at this level bool is_last = true;
bool is_last = false; for (size_t j = i + 1; j < paths.size(); ++j) {
for (size_t j = i + 1; j < paths.size(); j++) { std::string next_rel_path = get_relative_path(paths[j], start);
const auto& next_path = paths[j];
std::string next_rel_path = get_relative_path(next_path, start);
int next_level = std::count(next_rel_path.begin(), next_rel_path.end(), fs::path::preferred_separator); int next_level = std::count(next_rel_path.begin(), next_rel_path.end(), fs::path::preferred_separator);
if (next_level <= level) { if (next_level == level) {
is_last = (j == paths.size() - 1) || (next_level < level); is_last = false;
break;
}
if (next_level < level) {
break; break;
} }
} }
if (i == paths.size() - 1) is_last = true;
is_last_at_level[level] = is_last; is_last_at_level[level] = is_last;
@ -152,4 +155,4 @@ std::vector<std::string> TreeStructurer::get_directory_structure(const std::stri
} }
return result; return result;
} }