namespace {
-void
-get_cache_files_internal(const std::string& dir,
- uint8_t level,
- const Util::ProgressReceiver& progress_receiver,
- std::vector<std::shared_ptr<CacheFile>>& files)
-{
- DIR* d = opendir(dir.c_str());
- if (!d) {
- return;
- }
-
- std::vector<std::string> directories;
- dirent* de;
- while ((de = readdir(d))) {
- string_view name(de->d_name);
- if (name == "" || name == "." || name == ".." || name == "CACHEDIR.TAG"
- || name == "stats" || name.starts_with(".nfs")) {
- continue;
- }
-
- if (name.length() == 1) {
- directories.emplace_back(name);
- } else {
- files.push_back(
- std::make_shared<CacheFile>(fmt::format("{}/{}", dir, name)));
- }
- }
- closedir(d);
-
- if (level == 1) {
- progress_receiver(1.0 / (directories.size() + 1));
- }
-
- for (size_t i = 0; i < directories.size(); ++i) {
- get_cache_files_internal(
- dir + "/" + directories[i], level + 1, progress_receiver, files);
- if (level == 1) {
- progress_receiver(1.0 * (i + 1) / (directories.size() + 1));
- }
- }
-}
-
size_t
path_max(const char* path)
{
const ProgressReceiver& progress_receiver,
std::vector<std::shared_ptr<CacheFile>>& files)
{
- get_cache_files_internal(dir, 1, progress_receiver, files);
+ if (!Stat::stat(dir)) {
+ return;
+ }
+
+ size_t level_2_directories = 0;
+
+ Util::traverse(dir, [&](const std::string& path, bool is_dir) {
+ auto name = Util::base_name(path);
+ if (name == "CACHEDIR.TAG" || name == "stats" || name.starts_with(".nfs")) {
+ return;
+ }
+
+ if (!is_dir) {
+ files.push_back(std::make_shared<CacheFile>(path));
+ } else if (path != dir
+ && path.find('/', dir.size() + 1) == std::string::npos) {
+ ++level_2_directories;
+ progress_receiver(level_2_directories / 16.0);
+ }
+ });
+
+ progress_receiver(1.0);
}
std::string