]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Use Util::traverse in Util::get_level_1_files
authorJoel Rosdahl <joel@rosdahl.net>
Sat, 9 May 2020 20:34:16 +0000 (22:34 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Tue, 12 May 2020 19:13:50 +0000 (21:13 +0200)
src/Util.cpp

index b9987b7a59ca901c7497fcf84d3cce8b881caf21..be057e86d431c3d2a2322cf2ce353db0c62b87c8 100644 (file)
@@ -33,48 +33,6 @@ using nonstd::string_view;
 
 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)
 {
@@ -310,7 +268,28 @@ get_level_1_files(const std::string& dir,
                   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